在 /OPT:ICF 存在的情况下,Visual Studio 2013 是否可以正确优化?

2024-03-21

我希望下面的程序始终返回 0。但是,对于 Visual Studio 2013(更新 4),程序在发布版本中退出 1。我不确定这是否是一个错误,或者编译器的优化器是否正确并且依赖于某些边缘行为。如果关闭 CONST 宏,则释放 exe 将返回 0。如果优化器确实正确,我能得到允许它发出它所执行的代码的原因吗?

#if 1
#   define CONST const
#else
#   define CONST
#endif


class TypeId {
public:
    bool operator== (TypeId const & other) const
    {
        return id == other.id;
    }

private:
    TypeId (void const * id)
        : id(id)
    {}

public:
    template <typename T>
    static TypeId Get ()
    {
        static char CONST uniqueMemLoc = 0;
        return TypeId(&uniqueMemLoc);
    }

private:
    void const * id;
};


int main(int, char **)
{
    typedef int A;
    typedef unsigned int B;

    if (TypeId::Get<A>() == TypeId::Get<B>()) {
        return 1;
    }
    return 0;
}

根据 C++11 标准部分草案,这似乎不是有效的优化14.8 [温度.fct.规格] says (强调我的前进):

每个函数模板专门化都是从模板实例化的有 任何静态变量的自己的副本。 [ 例子:

template<class T> void f(T* p) {
static T s;
};
void g(int a, char* b) {
    f(&a); // calls f<int>(int*)
    f(&b); // calls f<char*>(char**)
}

这里 f(int*) 有一个 int 类型的静态变量 s 和 f(char**) 有一个 char* 类型的静态变量 s。 —结束示例]

由于您获取了变量的地址,因此折叠它们会影响可观察到的行为,这将违反假设规则 http://en.cppreference.com/w/cpp/language/as_if.

T.C.指出/opt:noicf防止不合格行为。

马特·麦克纳布指出/OPT(优化)文档 https://msdn.microsoft.com/en-us/library/bxwfs976.aspx包含以下注释:

因为 /OPT:ICF 会导致相同的地址被分配给 不同的函数或只读数据成员(const 变量 使用 /Gy 编译),它可以破坏依赖于唯一的程序 函数或只读数据成员的地址。了解更多 信息,请参阅 /Gy(启用功能级链接)。

这表明这可能是故意的不合格行为。本·沃伊特在评论中说现在转移到聊天 https://chat.stackoverflow.com/rooms/73053/discussion-on-answer-by-shafik-yaghmour-is-visual-studio-2013-optimizing-correct这确实意味着可以进行优化不合格但这一点是值得商榷的。

用户usrlinked https://stackoverflow.com/questions/29056890/is-visual-studio-2013-optimizing-correctly-in-the-presence-of-opticf#comment46359307_29056890 to an MS 博客文章:“/Gw”编译器开关简介 http://blogs.msdn.com/b/vcblog/archive/2013/09/11/introducing-gw-compiler-switch.aspx它说:

请注意,ICF 优化仅适用于相同的情况 地址未被占用的 COMDAT,并且它们是只读的。如果一个 数据未取地址,则 ICF 破坏地址唯一性 不会导致任何可观察到的差异,因此它是有效的并且 符合标准。

后来的评论说:

即使它本身就是完全标准的抱怨,当 与 /Gy 结合可能会导致潜在的破坏行为。

据我所知,为了/Gy影响const变量__declspec(选择)必须使用,但在文档中可能会更清楚。

至少我们可以看到/Gw不应引入不合格行为,但/Gy结合/Gw may.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 /OPT:ICF 存在的情况下,Visual Studio 2013 是否可以正确优化? 的相关文章

随机推荐

  • 如何在C++中输出变量的二进制值

    我的 C 编程课上有一项作业 要求编写一个输出变量值的二进制值的函数 例如 如果我将 a 的值设置为字符 我应该得到 a 输出的二进制值 我的 C 教授并不是全世界最伟大的 而且我在使用他给我们的神秘示例来使我的代码正常工作时遇到了困难 现
  • 在 LINQ 中学习表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您可以推荐哪些有关 LINQ 表达式树的文章 教程 Link https learn microsof
  • 在执行另一个方法时(动态)更新标签文本

    我是一名 iOS 开发人员 目前正在开发 iPhone 应用程序 我有一个关于更新 ViewController 内容的简单问题 如果我能得到了解此问题的人的反馈或有建议的解决方案 我将不胜感激 我正在编写一种方法 不断更新标签的文本 以及
  • 如何在通过域名输入时仅显示一次页面预加载器?

    所以 我在主页上有 jQuery 页面预加载器 如下所示
  • 如何在 Android Studio (4.2) 中查看 JetpackCompose kotlin 源代码? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 When I command click进入 JetpackCompose 函数 我看到的全部如下 根据 Android Studio 4
  • Ansible 要求安装 MySQL-python,尽管它已经安装

    我正在尝试使用在 Mac OSX 上运行的 Ansible 控制器创建一个新的 MySQL 数据库 当我第一次得到msg the python mysqldb module is required错误消息 我添加了一个任务来安装MySQL
  • 无法通过java Runtime.getRuntime().exec()执行CURL命令

    我正在使用 java 执行curl 命令 curl i user OAMADMIN tenant 358922247351079 svc 358922247369079 APPID Iuj 2swilg5fhv H Content Type
  • next.js 和material-ui - 让它们工作

    我给予next js旋转了一下 我无法让最简单的设置起作用 这是我的设置 相关库 反应 16 2 0 react dom 16 2 0 下一个 4 2 2 express 4 16 2 下一个路线 1 2 0 material ui 0 2
  • sizeof() 不由预处理器执行

    if sizeof int 4 do something 在内部使用 sizeof if在里面时不工作 define它有效 为什么 define size x sizeof x sizeof x 0 works 没有什么是邪恶的 一切都可能
  • “即时”编辑大型 xml 文件

    我有一个存储在数据库 blob 中的 xml 文件 用户将通过 spring hibernate Web 应用程序下载该文件 在通过 Hibernate 作为 byte 检索它之后 但在将其发送到输出流之前 我需要编辑 XML 的某些部分
  • 在引用之前如何确保类是有效的?

    public class Person public string FullName get set public int PhoneNumber get set public int CarQTY get set 如果有人没有完全填充对象
  • Symfony2 - 将 /web 目录重定向到 root

    我的 Symfony 项目存在重复内容问题 以下网址提供相同的内容 www mywebsite com web page and www mywebsite com page 这是我的内容 htaccess file
  • 如何列出(或导出)数据库中所有触发器的代码?

    我正在将数据库中的当地时间更改为 UTC 时间 有很多触发器将信息复制到当前使用的历史表GETDATE 我想找到每个使用的触发器GETDATE 代替GETUTCDATE 在数据库中 有什么方法可以自动执行此操作 我已将它们列出select
  • 从 Postgis 获取投影限制

    我收到以纬度 经度坐标对形式对 API 进行的空间查询 我的空间数据是不覆盖整个地球的投影 因此某些查询超出范围 我想用有用的错误消息来回复错误的查询 我不想尝试在 GIS 规范或标准中找出每个投影的边界 并从中获取正确的纬度 经度对 而是
  • 将电报机器人与谷歌应用程序脚本连接

    我在电报机器人上设置了一个机器人 并通过以下应用程序脚本将其与谷歌电子表格连接this https www youtube com watch v mKSXd od4Lg教程 这是代码 var token FILL IN YOUR OWN
  • Node JS - 通过引用其他文件传递 Javascript 对象

    我通过如下要求定义了一个http服务器 var http require http function onRequest request response console log Request request console log Re
  • .NET Core 中的 CORS

    我正在尝试以这种方式在 NET Core 中启用 CORS public IConfigurationRoot Configuration get public void ConfigureServices IServiceCollecti
  • Android:来电自动接听,播放音频文件

    在Android中 当有来电时 我想接听它 然后 从我的应用程序中 在通话期间自动播放音频文件 对方应该听到它 这可能吗 你所说的情况在安卓上是不可能实现的 Android 无法访问通话中的音频流 不过我可以给你一些关于如何去做的想法 首先
  • 无需登录即可启动Raspberry Pi [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想问你是否有任何方法可以启动树莓派 使用Raspbian 而无需登录和密码并直接进入GUI 以 Windows 为例 拉斯布比喘息 以下
  • 在 /OPT:ICF 存在的情况下,Visual Studio 2013 是否可以正确优化?

    我希望下面的程序始终返回 0 但是 对于 Visual Studio 2013 更新 4 程序在发布版本中退出 1 我不确定这是否是一个错误 或者编译器的优化器是否正确并且依赖于某些边缘行为 如果关闭 CONST 宏 则释放 exe 将返回