gpt4 book ai didi

c++ - 如果不同翻译单元中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?

转载 作者:太空狗 更新时间:2023-10-29 23:38:44 27 4
gpt4 key购买 nike

首先,只是为了避免 XY 问题:这个问题来自 https://github.com/cnjinhao/nana/issues/445#issuecomment-502080177 .库代码可能不应该做这样的事情(依赖未使用的全局对象的构造),但问题更多的是它是否是有效的 LTO 行为而不是代码质量问题。


展示相同问题的最少代码(未经测试,只是为了让示例更小):

// main.cpp
#include <lib/font.hpp>

int main()
{
lib::font f;
}
// lib/font.hpp
namespace lib
{
struct font
{
font();

int font_id;
};
}
// lib/font.cpp
#include <lib/font.hpp>
#include <lib/font_abstraction.hpp>

namespace lib
{
font::font()
{
font_id = get_default_font_id();
}
}
// lib/font_abstraction.hpp
namespace lib
{
int get_default_font_id();

void initialize_font();
}
// lib/font_abstraction.cpp
#include <lib/font_abstraction.hpp>

namespace lib
{
static int* default_font_id;

int get_default_font_id()
{
return *default_font_id;
}

void initialize_font()
{
default_font_id = new int(1);
}
}
// lib/platform_abstraction.hpp
namespace lib
{
struct platform_abstraction
{
platform_abstraction();
};
}
// lib/platform_abstraction.cpp
#include <lib/platform_abstraction.hpp>
#include <lib/font_abstraction.hpp>

namespace lib
{
platform_abstraction::platform_abstraction()
{
initialize_font();
}

static platform_abstraction object;
}

main.cppfont对象的构造依赖于指针的初始化。唯一初始化指针的是全局对象 object 但它未被起诉 - 在链接问题的情况下,该对象已被 LTO 删除。 允许这样的优化吗? (参见 C++ draft 6.6.5.1.2)

一些注意事项:

  • 该库是作为静态库构建的,并使用 -flto -fno-fat-lto-objects 和动态 C++ 标准库与主文件链接。
  • 可以在完全不编译 lib/platform_abstraction.cpp 的情况下构建此示例 - 在这种情况下,指针肯定不会被初始化。

最佳答案

VTT 的答案给出了 GCC 答案,但问题被标记为 language-lawyer。

ISO C++ 的原因是翻译中定义的对象必须在第一次调用同一翻译单元中定义的函数之前进行初始化。这意味着必须在调用 platform_abstraction::platform_abstraction() 之前初始化 platform_abstraction::object。正如链接器正确计算出的那样,没有其他 platform_abstraction 对象,因此永远不会调用 platform_abstraction::platform_abstraction,因此 object 的初始化可以无限期推迟。符合要求的程序无法检测到这一点。

关于c++ - 如果不同翻译单元中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56628469/

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