不能在单独的翻译单元中为成员函数的实现指定 `__forceinline`

编程语言 2026-07-10

请考虑以下三个文件“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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章