c++ - 我如何强制编译器生成的类的复制构造函数*不*被编译器内联?

标签 c++ visual-c++ inline compiler-optimization

备用问题标题为: 如何明确让编译器为特定翻译单元中的编译器生成的构造函数生成代码?

我们面临的问题是,对于一个代码路径,如果一个对象的复制构造器调用是,则结果——彻底测量——性能会更好(大约 5%)不是内联的,也就是说,如果这个构造函数是手动实现的。 (我们注意到这一点是因为在代码清理期间,删除了该类(17 个成员)多余的显式实现的复制构造函数。)

编辑:请注意,我们检查了生成的汇编代码,并确保内联和代码生成按照我对两个不同代码版本的描述进行。

我们现在面临的选择是将手动复制构造函数代码放回去(它与编译器生成的代码完全相同)还是寻找任何其他内联复制构造函数的方法这个类。

是否有任何方法(对于 Microsoft Visual C++)在特定翻译单元中显式实例化编译器生成的类函数,或者它们是否始终内联在使用它们的每个翻译单元中? (也欢迎对 gcc 或其他编译器发表评论,以便更好地了解情况。)


由于前 2 个答案显示出一些误解:编译器生成 类函数仅在用户既未声明也未定义的情况下由编译器本身生成。因此,不能对它们应用任何修饰符,因为源代码中不存在这些函数。

struct A {
  std::string member;
};

A 有一个默认和复制构造函数、一个 dtor 和一个复制运算符。这些函数都不能通过一些 declspec 修改,因为它们不存在于代码中。

struct B {
  std::string member;
  B(B const& rhs);
};

B 现在有一个用户提供 复制构造函数,用户必须实现它。编译器不会为其生成代码。


为怀疑者提供更多背景知识 :-) ...

此代码是使用 MS Visual C++ 编译的,但它链接到嵌入式(类似)(实时)系统。性能是通过对该系统进行计时来衡量的,因此我认为进行计时的人会有一些不错的数字。

测试是通过比较两个代码版本来执行的,其中唯一的区别是这一类的内联与非内联复制构造函数。内联代码的时间差了大约 5%。


进一步检查表明我在一点上弄错了:编译器为复杂的复制构造函数生成单独的函数。它会自行决定执行此操作,并且还取决于优化设置。所以在我们的例子中,编译器在我们的特定情况下做了错误的事情。从目前的答案来看,我们似乎无法以其他方式告诉编译器。 :-(

最佳答案

$12.1/5- "An implicitly-declared default constructor is an inline public member of its class.".

所以我们也无能为力。隐式构造函数必须是内联的。在这方面的任何其他行为都可能是扩展

话虽如此,

很可能您的手动复制构造函数(您在代码清理期间删除了它)正在做正确的事情。例如,如果您的类中的一个成员(共 17 个)是指针成员,则手动复制构造函数很可能负责深度复制(因此性能受到影响)。

因此,除非您仔细检查您的手动复制构造函数,否则不要考虑删除它并依赖(可能有问题的)隐式复制构造函数(在您的上下文中)

关于c++ - 我如何强制编译器生成的类的复制构造函数*不*被编译器内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3870538/

相关文章:

C++代码改进,数组越界

c++ - 打开/写入 txt 的基本程序随机崩溃/打不开

java - 在 J2EE 应用程序中内联显示 MS-Office 文档和电子表格

c++ - 函数被内联的可能性取决于它在 C++ 中的定义位置

c++ - 访问具有多重继承和模板的基类成员

c++ - 如何在 XWindows 中获取装饰窗口的内部尺寸?

c++ - MSVC 的 PCH 编译器选项

c++ - 函数定义的顺序对于 C++ 中的内联很重要吗

c++ - 我如何确定拥有多个 VC++ CRT 状态是否对我的应用程序有问题?

c++ - Lambda 的 "this"捕获返回垃圾