为什么 GCC 不将静态初始化的 C++ class 对象放入 .data

why doesn't GCC place a statically-initialized C++ class object into .data

这里有两个类似的 C++ 对象类型声明:

struct Obj {
    int x;
};

struct ObjC {
    int x;
    ObjC(int x) : x(x) {};
};

Obj obj1 = {100}
ObjC obj2(200);

使用最新版本的 gcc (riscv64-unknown-elf-toolchain-10.2.0-2020.12.8) 我发现变量 obj1 正确放置在 .data 部分....变量 obj2 , 然而, 被放置在 .bss 部分 初始化....

我知道 GCC 在启动时对 运行 构造函数有规定;但在这种情况下,obj2 的初始状态在编译时已知....

FWIW,我的 IAR 编译器没有问题....

我需要向 GCC 提供某种“提示”吗????

不使用 constexpr 标记构造函数似乎会阻止此处的优化。以下类型似乎已正确初始化,see godbolt:

struct ObjC2 {
    int x;
    constexpr ObjC2(int x)
        : x(x)
    {
    }
};

ObjC2 obj3(300);

如果您想增加某些东西在编译时被评估的机会,并向编译器承诺代码可以在编译时被评估,那么添加 constexpr 关键字:

struct Obj {
    int x;
};

struct ObjC {
    int x;
    constexpr ObjC(int x) : x(x) {};
};

但这并不强制编译器在编译时求值。为此,用 constinit:

标记变量
constinit Obj obj1 = {100}
constinit ObjC obj2(200);

注:constinit不会使变量const.