奇怪的海湾合作委员会行为

2024-03-19

给出以下 C++ 代码:

struct vertex_type {
    float x, y, z;

    //vertex_type() {}
    //vertex_type(float x, float y, float z) : x(x), y(y), z(z) {}
};

typedef struct {
    vertex_type vertex[10000];
} obj_type;

obj_type cube = {
    {
        {-1, -1, -1},
        {1, -1, -1},
        {-1, 1, -1},
        {1, 1, -1},

        {-1, -1, 1},
        {1, -1, 1},
        {-1, 1, 1},
        {1, 1, 1}
    }
};

int main() {
    return 0;
}

当我将(当前注释掉的)构造函数添加到vertex_typestruct 时,编译时间突然增加了 10-15 秒。 被难住了,我查看了 gcc 生成的程序集(使用-S),并注意到代码生成的大小比以前大了数百倍。

...
movl    $0x3f800000, cube+84(%rip)
movl    $0x3f800000, cube+88(%rip)
movl    $0x3f800000, cube+92(%rip)
movl    $0x00000000, cube+96(%rip)
...
movl    $0x00000000, cube+119996(%rip)
...

通过省略构造函数定义,生成的程序集完全不同。

.globl cube
    .data
    .align 32
    .type   cube, @object
    .size   cube, 120
cube:
    .long   3212836864
    .long   3212836864
    .long   3212836864
    .long   1065353216
    .long   3212836864
    .long   3212836864
    .long   3212836864
    .long   1065353216
    .long   3212836864
    .long   1065353216
    .long   1065353216
    .long   3212836864
    .long   3212836864
    .long   3212836864
    .long   1065353216
    .long   1065353216
    .long   3212836864
    .long   1065353216
    .long   3212836864
    .long   1065353216
    .long   1065353216
    .long   1065353216
    .long   1065353216
    .long   1065353216
    .zero   24
    .text

显然,编译器生成的代码存在显着差异。 这是为什么? 另外,为什么 gcc 在一种情况下将所有元素归零,而不是在另一种情况下?

edit:我正在使用以下编译器标志:-std=c++0x使用 g++ 4.5.2。


这是一个由来已久的GCC 中缺少优化 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=4131. It should能够为这两种情况生成相同的代码,但它不能。

没有构造函数,你的vertex_type是一个 POD 结构,GCC 可以在编译时初始化其静态/全局实例。使用构造函数,它最多可以生成代码以在程序启动时初始化全局。

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

奇怪的海湾合作委员会行为 的相关文章

随机推荐

  • 记录器服务错误:鼠标左键按下:无法找到匹配的元素 - Xcode 错误

    我正在尝试通过 XCTest 自动化我的 mac 应用程序 当尝试从 XCode 记录应用程序时 我收到以下错误消息 当我点击按钮时会发生这种情况 按钮层次结构是 按钮 gt 堆栈视图 gt NSView 这里 button是NSButto
  • 外键和索引问题

    我正在使用 SQL Server 2008 Enterprise 我有一个表 其中一个列引用另一个表 在同一个数据库中 中的另一列作为外键 这是相关的SQL语句 更详细地说 表 Foo 中的列 AnotherID 引用了另一个表表 Goo
  • 如何使用 sass 正确避免在 HTML 上嵌入 twitter bootstrap 类名

    我正在开发一个刚刚开始的 Rails 项目 我们想使用 twitter bootstrap 作为我们样式的基础 一开始我们只是直接在 HTML 代码上使用 bootstrap 的类名 就像 bootstrap 的文档中所示 但在阅读以下文章
  • 如何检查 Python 数组中是否存在某个元素(相当于 PHP in_array)?

    我是 Python 新手 我正在寻找一个标准函数来告诉我数组中是否存在某个元素 我找到了index方法 但如果未找到该元素 则会抛出异常 我只需要一些可以返回的简单函数true如果该元素在数组中或者false if not 基本上相当于 P
  • hook_user():将额外的字段插入数据库而不仅仅是表单

    我可以在注册中添加一个额外的字段 我需要知道的是我需要采取什么步骤来获取该输入并将其插入到 drupal 的用户表中 下面的代码位于我的模块中 它仅向表单添加一个字段 但是当提交时 它不会对数据执行任何操作 function perscri
  • 如何组合两个索引不同的 pandas 系列?

    我尝试将两个不同索引的系列组合在一起 相同的行数 我试过pd concat s1 s2 axis 1 例如 s1 为 index s1 0 1 5 1 2 s2 是 index s2 a 1 b 2 但我得到 index s1 s2 0 1
  • 批量从文本文件中删除重复行

    是否可以从文本文件中删除重复的行 如果是 怎么办 当然可以 但就像大多数批处理文本文件一样 它并不漂亮 而且不是特别快 该解决方案在查找重复项时忽略大小写 并对行进行排序 文件名作为第一个也是唯一一个参数传递给批处理脚本 echo off
  • 运行 jQuery 函数 onclick

    所以我实现了一些 jQuery 它基本上通过由滑块激活的滑块来切换内容 a 标签 现在考虑一下 我宁愿让保存链接的 DIV 本身就是链接 我正在使用的 jQuery 在我的脑海中看起来像这样 a
  • 用 jQuery 收集表单中的所有项目

    如何收集 jQuery 中的所有复选框和下拉列表项进行保存 或者 对于最新版本的 jquery 您可以使用 http docs jquery com Ajax serialize http docs jquery com Ajax seri
  • 如何解决DEP6500和DEP6701错误?

    我有一个项目叫BTLE在它自己的解决方案中 加载项目并使用手机上的调试器运行它可以找到 我有第二个解决方案 可以很好地加载和编译 我添加了BTLE项目 添加 现有项目 到第二个解决方案 编译它并尝试在调试器中运行它 我可以看到应用程序已正确
  • 使用 PIG 从 Hive 表解析嵌套 XML 字符串

    我正在尝试使用 PIG 从 Hive 表中的字段而不是从 XML 文件中提取一些 XML 这是我读过的大多数示例的假设 XML 来自排列如下的表 ID XML string XML 字符串包含 n 行 始终包含最多 10 个属性中的至少一个
  • 如何在 Python 中写入原始二进制数据?

    我有一个 Python 程序 可以存储数据并将数据写入文件 数据是原始二进制数据 内部存储为str 我正在通过 utf 8 编解码器将其写出来 但是 我得到UnicodeDecodeError charmap codec can t dec
  • 使用 ASP.Net 2.0 创建 SOAP 请求

    我正在与服务器网站的技术联系人交谈 他希望我使用 Visual Studio 而我只想手写脚本 请参阅下文了解我需要生成的 SOAP 请求 我已将实际 URL 替换为虚拟 URL 正如您可能猜到的那样 我对 ASP 和 SOAP 还很陌生
  • Wagtail 文档:大文件(>2GB)上传失败

    我正在尝试使用 Wagtail 应用程序中内置的 wagtaildocs 应用程序上传文件 我已经使用 Nginx 的 Digital Ocean 教程方法设置了 Ubuntu 16 04 服务器 鳐鱼 Postgres 一些初步澄清 在我
  • 包签名与之前安装的版本不匹配

    这是我的项目 https github com kenpeter my hak news https github com kenpeter my hak news 它是直接复制https github com grigio HAgnost
  • Google Map API V3.0 - 如何检测 MapTypeId 更改

    要添加侦听器来检测缩放更改 请执行以下操作 google maps event addListener map zoom changed function 检测地图类型变化的代码是什么ROADMAP到另一个视图 例如SATELLITE 我可
  • .net/C# 中的网络

    有人可以为我指明学习如何在 C net 3 5 中进行网络连接的正确方向吗 欢迎提供代码示例和解释 基本上我正在寻找如何进行异步 多线程服务器 客户端模型 我对如何使用 WinSock 在 C 中实现这一点的基础知识相当满意 但尽管我所有的
  • 检测 osx 何时睡眠/从睡眠中恢复

    是否可以编写一个 python 程序 我认为我将作为守护进程运行 来检测 osx 何时进入睡眠状态以及何时从睡眠状态恢复 如果听起来我没有研究过这一点 我很抱歉 我已经超出了我的舒适区 不确定我是否需要从 python 委托给用 C 编写的
  • 如何在Python中以相同比例在同一图形上绘制两个3D矩阵图

    我有两个矩阵 我希望在同一个图上的两个子图上有相应的两个 3D 图 并且具有相同的 z 轴 到目前为止 这是我的代码 import numpy as np import matplotlib pyplot as plt from mpl t
  • 奇怪的海湾合作委员会行为

    给出以下 C 代码 struct vertex type float x y z vertex type vertex type float x float y float z x x y y z z typedef struct vert