草庐IT

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

c++ - C++ 内联函数的定义必须在同一个文件中吗?

我将函数show()定义为内联在名为ex.h的头文件中,并在ex.cpp中定义函数>。我预计这会给我一个错误,因为编译器不知道在调用show()函数的位置替换什么。但是因为我使用的是IDE,所以效果很好。怎么会这样?顺便说一句,当我尝试手动编译它时,它给了我一个错误,即show()已使用但未定义。 最佳答案 It'simperativethatthefunction'sdefinition(thepartbetweenthe{...})beplacedinaheaderfile,unlessthefunctionisusedonly

c++ - C++ 内联函数的定义必须在同一个文件中吗?

我将函数show()定义为内联在名为ex.h的头文件中,并在ex.cpp中定义函数>。我预计这会给我一个错误,因为编译器不知道在调用show()函数的位置替换什么。但是因为我使用的是IDE,所以效果很好。怎么会这样?顺便说一句,当我尝试手动编译它时,它给了我一个错误,即show()已使用但未定义。 最佳答案 It'simperativethatthefunction'sdefinition(thepartbetweenthe{...})beplacedinaheaderfile,unlessthefunctionisusedonly

c++ - 非整数常数

我想要一个包含非整数常量的头文件,例如一类。请注意,该常量不需要必须是编译时常量。staticconststd::stringTen="10";这可以编译,但不受欢迎,因为每个编译单元现在都有自己的Ten拷贝。conststd::stringTen="10";这将编译,但会因多重定义的十的链接器错误而失败。constexprstd::stringTen="10"s;这会起作用,但前提是字符串构造函数也是constexpr。会的,但我不能指望每个非整数常量都有一个constexpr构造函数……或者我可以吗?externconststd::stringTen="10";这似乎可行,但我担心

c++ - 非整数常数

我想要一个包含非整数常量的头文件,例如一类。请注意,该常量不需要必须是编译时常量。staticconststd::stringTen="10";这可以编译,但不受欢迎,因为每个编译单元现在都有自己的Ten拷贝。conststd::stringTen="10";这将编译,但会因多重定义的十的链接器错误而失败。constexprstd::stringTen="10"s;这会起作用,但前提是字符串构造函数也是constexpr。会的,但我不能指望每个非整数常量都有一个constexpr构造函数……或者我可以吗?externconststd::stringTen="10";这似乎可行,但我担心

c++ - 为什么内联构造函数和析构函数在 C++ 中不是一个好主意?

我记得(很久以前)在一本C++书籍中读到,使用内联构造函数和析构函数并不是一个好主意,尤其是对于派生类。我知道内联会导致目标代码膨胀,但是是否有任何其他设计考虑不鼓励内联构造函数和析构函数?当然,大多数编译器可能会拒绝内联并继续创建函数体,但如果他们要内联,可能需要付出什么代价? 最佳答案 编译器可以自由地内联您未声明为inline的代码,也可以自由地不内联您已声明为inline的代码。我已经看到编译器做了这两件事。因此,inline关键字并不像大多数人认为的那样。它的意思是允许一个定义规则的异常(exception),所以你可以把