编译器是否可以跨多个翻译单元复制同一模板的实例化?
例如,如果你有一个使用std:vector<int>函数内部的a.cpp,而b.cpp使用同样的东西,那么std::vector<int>在最终的二进制文件中有两次冒险吗?
g ++(4.7.2)和类似版本似乎在编译期间以惊人的速度评估constexpr.事实上在我的机器上比运行时编译的程序快得多.
这种行为有合理的解释吗?是否存在仅在编译时适用的优化技术,可以比实际编译的代码更快地执行?如果是这样,哪个?
这是我的测试程序和观察结果.
#include <iostream>
constexpr int mc91(int n)
{
return (n > 100)? n-10 : mc91(mc91(n+11));
}
constexpr double foo(double n)
{
return (n>2)? (0.9999)*((unsigned int)(foo(n-1)+foo(n-2))%100):1;
}
constexpr unsigned ack( unsigned m, unsigned n )
{
return m == 0
? n + 1
: n == 0
? ack( m - 1, 1 )
: ack( m - 1, ack( m, n - 1 ) );
}
constexpr unsigned slow91(int n) {
return mc91(mc91(foo(n))%100);
}
int main(void) …Run Code Online (Sandbox Code Playgroud) 我已经使用Jenkins几年了,最近买了一台新的Windows 10 PC.我安装了Jenkins 2.89.2,Visual Studio 2017和Python 3.6,并从我以前的Windows 7 PC复制了几个Jenkins作业.
我遇到的问题是自由式Jenkins作业中的所有python脚本现在什么都不做.
我有类似的命令行批处理文件,它们运行这些python脚本,可以在新PC上的命令窗口中正常工作.
我还检查了文件关联ftype,最后更改了它:
ftype Python.File
Python.File="D:\Python36_64\python.exe" "%L" %*
Run Code Online (Sandbox Code Playgroud)
我的解决方法是这样的:
在Windows 7下工作的示例行:
CreateBuildNumber.py <=使用PATH查找此文件,然后使用文件关联来运行python
替换行需要在Windows 10下工作:
python .\Scripts\CreateBuildNumber.py <=使用PATH查找python.
如何避免脚本中的显式路径?
更新:
D:\project>assoc | findstr -i python
.py=Python.File
.pyc=Python.CompiledFile
.pyd=Python.Extension
.pyo=Python.CompiledFile
.pyw=Python.NoConFile
.pyz=Python.ArchiveFile
.pyzw=Python.NoConArchiveFile
echo %PATH%
D:\Python36_64;D:\Python36_64\Scripts;.\Scripts;"C:\Program Files\CppCheck";C:\windows\system32
Run Code Online (Sandbox Code Playgroud)
更多信息
我从%PATH%中删除了\ \脚本并重新运行了作业,同时也将demo.py移动到.\ Scripts,现在没有做任何事情,而是出现错误:
'demo.py' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
这意味着Windows IS正在寻找和查找python脚本,但未能执行它们.为什么Windows不采取下一步并使用文件关联来查找要运行的可执行程序,将文件作为参数?
更新:
现在一切正常,我不知道为什么.
我最近开始在Jenkins上使用不同的工作,这两年我既没有运行也没有触及过两年,而且只是在没有修改的情况下工作.我已经回过头来讨论这个问题并且还原了所有的变化,这个变化也很有效.
我的猜测是Windows 10已被修补.
我们运行一个项目,我们希望通过测试驱动开发来解决这个问题.我想到了启动项目时出现的一些问题.一个问题是:谁应该为功能编写单元测试?单元测试应该由功能实现的程序员编写吗?或者单元测试应该由另一个程序员编写,程序员定义了一个方法应该做什么,并且特征实现程序员在测试运行之前实现该方法?
如果我以正确的方式理解TDD的概念,那么特征实现程序员必须自己编写测试,因为TDD是具有小型迭代的过程.那么让另一个程序员编写的测试太复杂了吗?
你打算说什么?TDD中的测试应该由程序员自己编写,还是应该由其他程序员编写描述方法可以执行的测试?
我有200个数据行(意味着一小组数据).我想进行一些统计分析,但在此之前我想排除异常值.
为此目的有哪些潜在的算法?准确性是一个值得关注的问题.
我对Stats很新,所以需要非常基本的帮助.
我是python的新手,所以为天真的问题道歉.我有一份清单
l1 = [2, 4, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)
和另一个元组列表
l2 = [(4,6), (6,8), (8,10)]
Run Code Online (Sandbox Code Playgroud)
我想输出一个l3大小列表,l1用于比较l1第一个坐标的值,l2如果找到第一个坐标则存储第二个坐标l1,否则存储0.
输出:
l3 = [0, 6, 8, 0, 10]
Run Code Online (Sandbox Code Playgroud)
我厌倦了做一个for循环,如:
l3 = []
for i in range(len(l1)):
if l1[i] == l2[i][0]:
l3.append(l2[i][1])
else:
l3.append(0)
Run Code Online (Sandbox Code Playgroud)
但这不起作用.它给出了错误
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)
这显然l2比短于l1.
我已经typedef在C#中看到了很多问题的答案,我已经使用了,所以我有:
using Foo = System.Collections.Generic.Queue<Bar>;
Run Code Online (Sandbox Code Playgroud)
这很有效.我可以更改定义(尤其是更改Bar => Zoo等)以及使用Foo更改的所有内容.大.
现在我想要这个工作:
using Foo = System.Collections.Generic.Queue<Bar>;
using FooMap = System.Collections.Generic.Dictionary<char, Foo>;
Run Code Online (Sandbox Code Playgroud)
但是C#似乎并不喜欢Foo第二行,即使我已经在第一行中定义了它.
有没有办法使用现有的别名作为另一个的一部分?
编辑:我正在使用VS2008
我已经开始编写一个非常简单的类,各种类方法似乎给我带来了问题.我希望问题是我,解决方案很简单.
命令g ++ -o main main.cpp给出了以下输出:
/usr/bin/ld: Undefined symbols:
Lexer::ConsoleWriteTokens()
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
#include<iostream>
#include"lexer.h"
int main(){
Lexer lexhnd = Lexer();
std::cout << "RAWR\n";
lexhnd.ConsoleWriteTokens();
std::cout << "\n\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
lexer.h:
#ifndef __SCRIPTLEXER
#define __SCRIPTLEXER
#include <iostream>
#include <string>
#include <vector>
#define DEF_TOKEN_KEYWORD 0
struct token{
int flag;
std::string data;
};
class Lexer
{
public:
// bool IsTrue();
// bool AddLine(char * line);
void ConsoleWriteTokens(void);
private:
std::vector<token> TOK_list;
};
#endif
Run Code Online (Sandbox Code Playgroud)
lexer.cpp:
bool Lexer::IsTrue(){
return true; …Run Code Online (Sandbox Code Playgroud) 我有相当大的程序(> 10k行的C++代码).从Visual Studio中启动时,它在调试模式或发布模式下都能正常工作,但是从命令行手动启动时,释放模式二进制文件通常会崩溃(并不总是!!!).
删除行会导致崩溃:
bool Save(const short* data, unsigned int width, unsigned int height,
const wstring* implicit_path, const wstring* name = NULL,
bool enable_overlay = false)
{
char* buf = new char[17];
delete [] buf;
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据请求扩展了示例.
在我的测试用例中,"len"长度为16.没关系,如果我对buf做了一些事情,它会在删除时崩溃.
编辑:应用程序工作正常没有删除[]行,但我想它会泄漏内存(因为块永远不会被分配).删除行后从未使用的buf.它似乎也不会与除char之外的任何其他类型崩溃.现在我真的很困惑.
崩溃消息非常不明确(典型的Windows"xyz.exe已停止工作").当我单击"调试程序"选项时,它进入VS,其中错误被指定为"访问冲突写入位置xxxxxxxx".虽然"没有为任何堆栈帧加载符号",但无法找到错误的位置.
我想这是一个非常严重的堆损坏的情况,但如何调试这个?我应该寻找什么?
感谢帮助.
现在我们正在维护一些用VB6编写的旧项目,我们计划为它实现持续集成服务器.我们希望实现一些代码分析,以跟踪可维护性,至少不会变得更糟.基本上只有一个要求 - 工具应该是命令行,所以我们可以从持续集成服务器调用它,它应该适用于VB6项目.我将非常感谢任何有关工具的建议.
谢谢Maksym