Mar*_* Ba 7 c++ inline compiler-optimization visual-c++
替代问题标题是: 如何明确地让编译器为特定翻译单元中的编译器生成的构造函数生成代码?
我们面临的问题是,对于一个代码路径,如果没有内联一个对象的copy-ctor调用,那么得到的 - 彻底测量 - 性能会更好(大约5%),即如果这个构造函数是手动实现的.(我们注意到这一点,因为在代码清理期间,删除了此类(17个成员)的多余明确实现的副本ctor.)
编辑:请注意,我们已经检查了生成的汇编代码,并确信我描述了两个不同版本的代码内联和代码生成正在发生的事情.
我们现在面临的选择就是放弃手动复制代码(它与编译器生成的代码完全相同)或者找到其他任何不内联此类复制文件的方法.
是否有任何方法(对于Microsoft Visual C++)在特定的翻译单元中显式实例化编译器生成的类函数,或者它们是否总是在每个使用它们的翻译单元中内联?(欢迎使用gcc或其他编译器的评论来更好地了解情况.)
由于前2个答案显示出一些误解:编译器生成的类函数仅由编译器本身生成,如果它们既未声明也未由用户定义.因此,没有任何修饰符可以应用于它们,因为源代码中不存在这些功能.
struct A {
std::string member;
};
Run Code Online (Sandbox Code Playgroud)
A
有一个默认和复制ctor,一个dtor和一个复制操作符.这些函数都不能通过某些declspec修改,因为它们不存在于代码中.
struct B {
std::string member;
B(B const& rhs);
};
Run Code Online (Sandbox Code Playgroud)
B
现在有一个用户提供的副本ctor,用户必须实现它.编译器不会为它生成代码.
怀疑者的更多背景:-) ......
此代码使用MS Visual C++编译,但它链接到嵌入式(类似)(实时)系统.通过对这个系统进行计时来衡量绩效,因此我认为参加计划的人会得到一些不错的数据.
通过比较两个代码版本来执行测试,其中唯一的区别是这一类的内联与非内联副本.带内联代码的计时更差约5%.
进一步检查发现我在某一方面错了:编译器将为复杂的复制构造函数生成单独的函数.它将自行决定这一点,它还取决于优化设置.所以在我们的例子中,编译器在我们的特定情况下做错了.从答案到目前为止,似乎我们不能告诉编译器.:-(
$ 12.1/5-"隐式声明的默认构造函数是其类的内联公共成员."
所以我们无能为力.implcit构造函数必须是内联的.在这方面的任何其他行为可能是一个扩展
话说回来,
您的手动复制构造函数(在代码清理期间删除)可能是正确的.例如,如果类中的一个成员(17个中的一个)是指针成员,那么手动复制构造函数可能会处理深层复制(因此会影响性能).
因此,除非您仔细检查您的手动复制构造函数,否则甚至不要考虑删除它并依赖于(可能有错误的)隐式复制构造函数(在您的上下文中)
添加我自己的结论并回答确切的问题而不涉及细节:
您不能 强制编译器(特别是 VC++)内联或不内联编译器生成的 ctor/dtor/etc。-但
优化器将自行选择是否内联编译器生成的函数(ctor)的代码,或者是否为此代码生成“真实”函数。AFAIK 在这方面没有办法影响优化器的决策。
归档时间: |
|
查看次数: |
2078 次 |
最近记录: |