不能在单独的翻译单元中为成员函数的实现指定 `__forceinline`
请考虑以下三个文件“main.cpp”
#include ".hpp"
__declspec(noinline)
int main(int, char**)
{
x().DoFoo();
x::dobar();
::dobaz();
return 0;
}
“.hpp”
#pragma once
struct x {
void DoFoo(void);
static void dobar(void);
};
void dobaz(void);
以及“.cpp”
#include ".hpp"
#include <iostream>
void x::DoFoo(void)
{ std::cout << "Hello!\n"; }
void x::dobar(void)
{ std::cout << "World!\n"; }
void dobaz(void)
{ std::cout << "!\n"; }
对于/GL,当/Ob2被指定时,使用__forceinline extern在单个翻译单元中实现的函数可以允许将__forceinline提示应用于这些函数。然而,由于语法规则,这仅对自由函数成立:
#include ".hpp"
#include <iostream>
/*
* member function
*/
#if 0
/*
* emits C4630 and causes C4716
*/
extern void x::DoFoo(void)
#elif 0
/*
* wont emit an external implementation for x::DoFoo
*/
__forceinline void x::DoFoo(void)
#else
/*
* OK
*/
void x::DoFoo(void)
#endif
{ std::cout << "Hello!\n"; }
/*
* static member function
* emits C4630 but still seems to compile? not really sure whats going on here
*/
__forceinline extern void x::dobar(void)
{ std::cout << "World!\n"; }
/*
* free function
* compiles
*/
__forceinline extern void dobaz(void)
{ std::cout << "!\n"; }
我的主要问题是:如果可能,如何让成员函数获得__forceinline(或类似)的好处?否则我应该在__forceinline之外尝试哪些工具?
解决方案
你不需要使用__forceinline或以任何方式修改代码,就能让编译器对跨翻译单元的函数进行内联。进行发布构建,启用/GL(全程序优化)、/Ob2(对任意合适的进行内联),并使用/LTCG(链接时代码生成)进行链接,应该就足够了。
这是对Chronial的回答中示例的略微修改。尽管未使用__forceinline,x与 y的地址差仍为8 字节:https://godbolt.org/z/da46oMx8n
根据我的经验,如今的编译器似乎非常热衷于内联,因此不仅不再需要强制内联,有时我还需要强制编译器避免内联。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。