gpt4 book ai didi

C++11 在链接上调用寄存器函数?

转载 作者:可可西里 更新时间:2023-11-01 16:34:39 25 4
gpt4 key购买 nike

有没有什么方法可以仅通过链接其 .o 文件来调用函数?

例如:

foo.cpp:

extern int x;

void f() { x = 42; }

struct T { T() { f(); } } t; // we use constructor of global
// object to call f during initialization

bar.cpp:

#include <iostream>

int x;

int main()
{
std::cout << x;
}

编译/链接/运行:

$ g++ -c foo.cpp
$ g++ -c bar.cpp
$ g++ foo.o bar.o
$ ./a.out
42

这似乎适用于 gcc 4.7。它按预期输出 42。但是我记得在一些旧的编译器上我遇到了这种模式的问题,因为没有任何东西真正“使用” foo.o 它在链接时被优化了。 (也许这个特定的例子由于某种原因不能代表问题)

C++11 标准对这个模式有什么看法?是否保证有效?

最佳答案

我相信你并没有摆脱困境。该标准不保证您的代码按预期工作,尽管许多人依赖该行为来实现各种“自注册”结构。

您的对象 t 是动态初始化的,它具有调用 f 的副作用。该标准对静态存储对象的动态初始化有这样的说法(3.6.2/4,“非局部变量的初始化”):

It is implementation-defined whether the dynamic initialization of a non-local variable with static storage duration is done before the first statement of main. If the initialization is deferred to some point in time after the first statement of main, it shall occur before the first odr-use (3.2) of any function or variable defined in the same translation unit as the variable to be initialized.

在您的代码中,只有 x 被 odr 使用,但是 x 是在主翻译单元中定义的。您的程序中没有使用其他 TU 的变量或函数,因此从技术上讲,不能保证 t 会被初始化。从技术上讲,您的程序的静态控制流必须引用每个 TU 中的某些内容,以便初始化所有内容。

正如我所说,有很多带有“自注册”翻译单元的真实世界代码(例如在字符串键映射中注册工厂函数指针),因此只需将 TU 添加到最终程序,您最终会获得更多功能。有人告诉我,大多数编译器会无条件地初始化所有全局变量,因为不这样做会破坏很多现实世界的代码。但不要依赖它!

关于C++11 在链接上调用寄存器函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com