首先,只是为了避免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;
}
的建设font
对象在main.cpp
依赖于指针的初始化。唯一初始化指针的是全局对象object
但它没有被起诉 - 在链接问题的情况下,该对象已被 LTO 删除。允许这样的优化吗? (看C++ 草案 6.6.5.1.2)
一些注意事项:
- 该库被构建为静态库并使用以下命令与主文件链接
-flto -fno-fat-lto-objects
和动态C++标准库。
- 该示例无需编译即可构建
lib/platform_abstraction.cpp
根本没有 - 在这种情况下,指针肯定不会被初始化。