【问题标题】:Visual Studio warning C4743: How does Whole Program Optimization affect _fltused?Visual Studio 警告 C4743:整个程序优化如何影响 _fltused?
【发布时间】:2015-05-22 13:58:52
【问题描述】:

所以在工作中,我正在开发一个在没有 C++ 运行时库的情况下运行的 C++ 应用程序。我们使用的是 Visual Studio 2005,并指定了 /NODEFAULTLIB 开关。

解决方案的组织方式是有各种静态库项目,然后是使用这些库的单个可执行项目。这些库主要是在单独的存储库中跟踪的常见库。它们可以更改,但我们最好不要更改,如果可以避免的话。

其中一个常用库使用浮点数学。由于我们没有 C++ 运行时,我们自己定义了这些例程(例如:_ftol2_sse 用于将 float 转换为 int)。

根据我对底层细节的(相当有限的)理解,编译器发出符号_fltused 表示需要使用浮点数学例程。

由于某种原因,其他常用库之一决定手动定义此符号,如

extern "C" { unsigned short _fltused = 0; };

当我启用整个程序优化和链接时代码生成时,我得到 ​​p>

warning C4743: '_fltused' has different size ...

链接时。我不知道为什么我们将它声明为unsigned short 而不是int,但就是这样。

当我不启用整体程序优化或 LTCG 时,警告就会消失。

我想我有两个问题。

  1. 我可以放心地忽略此警告吗?
  2. 进行了哪些优化会导致出现警告?我不知道为什么在没有启用整体程序优化的情况下它不是警告。

更新

我找到了代码的原作者,他承认这是用汇编语言重写代码时出现的错误。他同意我的观点,警告是无害的,因为_fltused 从未真正直接使用过。

【问题讨论】:

    标签: c++ linker visual-studio-2005


    【解决方案1】:

    我想我至少可以回答 2 个。这不是任何特定的优化。事实上,整个程序优化迫使编译器保留整个程序的某些表示以供优化,并且从该中间表示中它能够确定相同的变量具有不同的大小。如果未启用整个程序优化,编译器只会分别查看每个源文件,而不会看到两个不同的文件为该符号定义了不同的类型。

    所有这一切,我 99% 确定您的程序违反了一个定义规则,“未定义的行为,不需要诊断”。如果你有任何机会修复它,你应该避免像编译器补丁破坏你的代码这样简单的事情。

    【讨论】:

    • 关于单一定义规则的观点很好,但我不确定情况是否如此。如果我注释掉库提供的 _fltused 定义,我会得到一个未解决的外部符号错误。这是否意味着使用浮点数学的库只生成一个声明,并将符号声明为int
    • @njpaul:单一定义规则管理的不仅仅是定义。
    • 但是,这种特殊情况违反了 3.5 的链接:“在所有类型调整之后(在此期间 typedefs (7.1.3) 被它们的定义替换),所有引用的声明指定的类型对给定变量或函数的声明应该是相同的,除了数组对象的声明可以指定数组类型,这些类型因存在或不存在主要数组边界而不同(8.3.4)。违反此规则的类型标识不需要诊断书。”而不是单一定义规则
    猜你喜欢
    • 2012-12-05
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多