草庐IT

c++ - header 中的 `const` 和 `constexpr` 变量是否应为 `inline` 以防止违反 ODR?

考虑以下header并假设它在多个TU中使用:staticintx=0;structA{A(){++x;printf("%d\n",x);}};作为thisquestion解释说,这是违反ODR的,因此是UB。现在,thereisnoODRviolation如果我们的inline函数引用了一个非volatileconst对象并且我们不在该函数中使用它(加上其他规定),所以这在标题中仍然可以正常工作:constexprintx=1;structA{A(){printf("%d\n",x);}};但如果我们碰巧使用它,我们又回到了与UB的第一方:constexprintx=1;struct

c++ - header 中的 `const` 和 `constexpr` 变量是否应为 `inline` 以防止违反 ODR?

考虑以下header并假设它在多个TU中使用:staticintx=0;structA{A(){++x;printf("%d\n",x);}};作为thisquestion解释说,这是违反ODR的,因此是UB。现在,thereisnoODRviolation如果我们的inline函数引用了一个非volatileconst对象并且我们不在该函数中使用它(加上其他规定),所以这在标题中仍然可以正常工作:constexprintx=1;structA{A(){printf("%d\n",x);}};但如果我们碰巧使用它,我们又回到了与UB的第一方:constexprintx=1;struct

c++ - 将函数定义放在头文件中

如果你想将函数定义放在头文件中,似乎有三种不同的解决方案:将函数标记为inline将函数标记为静态将函数放在匿名命名空间中(直到最近,我什至不知道#1。)那么这些解决方案有什么区别,我什么时候应该更喜欢哪个?我在只有头文件的世界里,所以我真的需要头文件中的定义。 最佳答案 static和未命名的命名空间版本最终是相同的:每个翻译单元都将包含它自己的函数版本,这意味着给定一个静态函数f,指针&f在每个翻译单元中会有所不同,程序中会包含N个不同版本的f(二进制中代码较多)。这不是在标题中提供a函数的正确方法,它将提供N个不同(完全相同)

c++ - 将函数定义放在头文件中

如果你想将函数定义放在头文件中,似乎有三种不同的解决方案:将函数标记为inline将函数标记为静态将函数放在匿名命名空间中(直到最近,我什至不知道#1。)那么这些解决方案有什么区别,我什么时候应该更喜欢哪个?我在只有头文件的世界里,所以我真的需要头文件中的定义。 最佳答案 static和未命名的命名空间版本最终是相同的:每个翻译单元都将包含它自己的函数版本,这意味着给定一个静态函数f,指针&f在每个翻译单元中会有所不同,程序中会包含N个不同版本的f(二进制中代码较多)。这不是在标题中提供a函数的正确方法,它将提供N个不同(完全相同)

c++ - 编译器内联函数有多深?

假设我有一些函数,每个函数大约有两行简单的代码,它们相互调用如下:A调用B调用C调用D...调用K。(所以基本上这是一连串的短函数调用。)编译器通常会在调用树中内联这些函数的深度是多少? 最佳答案 这个问题没有意义。如果您考虑内联及其后果,您就会意识到:避免函数调用(所有寄存器保存/帧调整)向优化器公开更多上下文(死存储、死代码、公共(public)子表达式消除...)重复代码(膨胀指令缓存和可执行文件大小等)在决定是否内联时,编译器会在产生的潜在膨胀和预期的速度增益之间进行平衡。这种平衡行为受选项影响:对于gcc,-O3表示优化速

c++ - 编译器内联函数有多深?

假设我有一些函数,每个函数大约有两行简单的代码,它们相互调用如下:A调用B调用C调用D...调用K。(所以基本上这是一连串的短函数调用。)编译器通常会在调用树中内联这些函数的深度是多少? 最佳答案 这个问题没有意义。如果您考虑内联及其后果,您就会意识到:避免函数调用(所有寄存器保存/帧调整)向优化器公开更多上下文(死存储、死代码、公共(public)子表达式消除...)重复代码(膨胀指令缓存和可执行文件大小等)在决定是否内联时,编译器会在产生的潜在膨胀和预期的速度增益之间进行平衡。这种平衡行为受选项影响:对于gcc,-O3表示优化速

c++ - 是否允许 C++ 优化器跨函数调用移动语句?

注意:这里根本没有多线程。刚刚优化了单线程代码。函数调用introducesasequencepoint.(显然。)是否允许编译器(如果优化器内联函数)允许在函数指令之前/之后移动/混合任何指令?(只要它可以明显地“证明”没有可观察到的效果。)说明背景:现在,有一个nicearticlewrt。一个C++的基准测试类,作者在其中声明:Thecodewetimewon’tberearrangedbytheoptimizerandwillalwaysliebetweenthosestart/endcallstonow(),sowecanguaranteeourtimingwillbeval

c++ - 是否允许 C++ 优化器跨函数调用移动语句?

注意:这里根本没有多线程。刚刚优化了单线程代码。函数调用introducesasequencepoint.(显然。)是否允许编译器(如果优化器内联函数)允许在函数指令之前/之后移动/混合任何指令?(只要它可以明显地“证明”没有可观察到的效果。)说明背景:现在,有一个nicearticlewrt。一个C++的基准测试类,作者在其中声明:Thecodewetimewon’tberearrangedbytheoptimizerandwillalwaysliebetweenthosestart/endcallstonow(),sowecanguaranteeourtimingwillbeval

c++ - 使用 dll 导出类时 __declspec(dllimport) 的未解析外部符号

我想定义一个基于dll导出类的派生类。基类在ProjectA中定义,派生类在ProjectB中。首先,在项目A中,定义了预处理器MYDLL_BUILD。我使用头文件来指定导出/导入:#if!defined(MYDLL_BUILD)#pragmacomment(lib,"myDll.lib")#endif#ifdefined(MYDLL_BUILD)#defineMYDLL_API__declspec(dllexport)#else#defineMYDLL_API__declspec(dllimport)#endif然后我定义基类:classMYDLL_APIDllObject{publ

c++ - 使用 dll 导出类时 __declspec(dllimport) 的未解析外部符号

我想定义一个基于dll导出类的派生类。基类在ProjectA中定义,派生类在ProjectB中。首先,在项目A中,定义了预处理器MYDLL_BUILD。我使用头文件来指定导出/导入:#if!defined(MYDLL_BUILD)#pragmacomment(lib,"myDll.lib")#endif#ifdefined(MYDLL_BUILD)#defineMYDLL_API__declspec(dllexport)#else#defineMYDLL_API__declspec(dllimport)#endif然后我定义基类:classMYDLL_APIDllObject{publ