【发布时间】:2015-09-21 08:46:01
【问题描述】:
我们有一个工具可以在头文件中生成一个类,该文件由硬编码数组生成。该自动生成由使用自动生成值的实际实现继承。
自动生成的例子:
class MyTestAutoGen
{
std::vector<int> m_my_parameter1;
std::vector<int> m_my_parameter2;
...
public:
MyTestAutoGen()
{
SetDefaultValueFor_my_parameter1();
SetDefaultValueFor_my_parameter2();
...
}
void SetDefaultValueFor_my_parameter1()
{
int tmp[] = {121,221,333,411,225,556,227,.......};
m_my_parameter1.assign(tmp, tmp + 65025);
}
void SetDefaultValueFor_my_parameter2()
{
int tmp[] = {333,444,333,987,327,16728,227,.......};
m_my_parameter2.assign(tmp, tmp + 65025);
}
...
};
编译这需要很多时间,在 VS 的输出窗口中,我可以看到它挂在编译的“生成代码”阶段,但它会在大约 15-30 分钟后完成编译,除非编译器崩溃堆栈溢出。
我尝试启用“多处理编译”和“并行代码生成”标志,但没有显示任何改进。禁用“整个程序优化”不是一个选项,因为在应用程序初始化后它应该尽可能优化。
我对这个问题的解决方法是修改自动生成的模板以将值保存在编码的二进制字符串中,以便数据可能存储在 TEXT 区域而不是库/可执行文件的 STATIC 区域。所以现在自动生成的代码看起来像(字符串的十六进制值只是为了显示):
class MyTestAutoGen
{
std::vector<int> m_my_parameter1;
std::vector<int> m_my_parameter2;
...
public:
MyTestAutoGen()
{
SetDefaultValueFor_my_parameter1();
SetDefaultValueFor_my_parameter2();
...
}
void SetDefaultValueFor_my_parameter1()
{
std::string codedDefaultValue = "\x079\0\0\0.......";
std::stringstream str(codedDefaultValue);
int tmp;
for (int i = 0; i < codedDefaultValue.length() / sizeof(int); i++)
{
str.read((char*) &tmp, sizeof(int));
m_my_parameter1.push_back(tmp);
}
}
void SetDefaultValueFor_my_parameter2()
{
std::string codedDefaultValue = "\x04d\x001.......";
std::stringstream str(codedDefaultValue);
int tmp;
for (int i = 0; i < codedDefaultValue.length() / sizeof(int); i++)
{
str.read((char*) &tmp, sizeof(int));
m_my_parameter2.push_back(tmp);
}
}
...
};
这个编译速度很快,但不容易阅读(这个文件不应该手动编辑,也不要随意查看)。
有没有更好的方法来做到这一点而不破坏它作为跨平台,不禁用优化并将其保留为头文件?
【问题讨论】:
-
为什么不能禁用 LTO?我认为如果开发可执行文件不那么快也没关系,在开发阶段快速编译更重要。您仍然可以在产品构建中使用 LTO。
-
其他开发人员正在使用这个 autogen 文件,他们需要在运行时测试他们的“重”实现,所以对他们来说它既是开发又是生产。创建 2 个构建配置(有和没有)对于所有相关方来说都很麻烦。
-
为什么一定要放在头文件里?您不能自动生成包含
SetDefaultValueFor_my_parameter1定义的 CPP 文件吗? -
@TripeHound 我在一个文件中完成它以简化外部集成。我尝试手动将代码提取到 cpp 文件并将其添加到项目中,但它对速度没有任何影响
-
"我们有一个在头文件中生成类的工具" 您可以改用直接生成目标文件的工具。
标签: c++ arrays performance visual-studio-2012