优化编译器中的常量组合

2024-02-26

我有一个包含许多小型内联函数的头文件。他们中的大多数碰巧拥有恒定的数据。由于这些函数对性能至关重要,因此它们处理常量的方式变得很重要。 AFAIK 有两种方法来引用常量:

1) 在稍后与应用程序链接的单独源文件中定义它们。

2) 就地定义常量。

我会选择后一种方式,因为它更易于维护。但是,如果编译器不优化通过内联创建的数千个相等常量,则速度可能会更慢。

问题:

编译器会合并这些相等的常量吗?特别是,将使用以下哪种方法?

1) 跨编译单元的相等常量的组合。
2) 跨链接模块(整个程序或库)组合相等常量
3) 将常数与any恰好具有相同位模式并满足整个编译单元或整个程序的对齐要求的静态常量数据。

我使用现代编译器(GCC4.5)。

我不是汇编专家,因此我无法使用几个简单的测试来回答这个问题:)

EDIT:

这些常量非常大(大多数至少有 16 个字节),因此编译器无法将它们设为立即值。

EDIT2:

代码示例

这个就地使用常量:

float_4 sign(float_4 a)
{
    const __attribute__((aligned(16))) float mask[4] = { //I use a macro for this line
        0x80000000, 0x80000000, 0x80000000, 0x80000000};
    const int128 mask = load(mask);
    return b_and(a, mask);
}

根据GCC http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Optimize-Options.html以下选项可以满足您的要求:

-fmerge-常量

尝试跨编译单元合并相同的常量(字符串常量和浮点常量)。 如果汇编器和链接器支持,则此选项是优化编译的默认选项。使用 -fno-merge-constants 来抑制此行为。
在-O、-O2、-O3、-Os 级别启用。

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

优化编译器中的常量组合 的相关文章

随机推荐

  • 在 Windows 事件查看器中诊断 CLR 错误

    我们有一个 NET 桌面应用程序在生产中崩溃了 我们如何诊断错误 我想知道发生的异常类型 错误消息和堆栈跟踪 因为我们的代码没有处理异常 所以我们收到了 此应用程序遇到问题 需要关闭 Windows 消息框 唯一的选择就是关闭 没有调试按钮
  • 字符串匹配不同大小的 data.frames

    我有两个不同大小的 data frame 我正在寻找最有效的方法来将字符串从一个 data frame 匹配到另一个 data frame 并提取一些相关信息 这是一个例子 两个初始 data frames a 和 b 以及所需的结果 a
  • 如何使图像大小适应html表格中的行高

    我正在尝试制作一个强大的 html 签名以在 Thunderbird 中使用 我所说的稳健是指它不仅在 Thunderbird 中看起来正确 而且在我向其发送邮件的其他邮件客户端中也必须正确 例如 我使用 Gmail 进行了测试 布局非常简
  • ASP.Net Core 中的 AntiXSS

    Microsoft Web 保护库 AntiXSS https wpl codeplex com 已达到使用寿命 该页面指出 在 NET 4 0 中 框架中包含了一个 AntiXSS 版本 可以通过配置启用 在 ASP NET v5 中 基
  • PHP + Comet(长轮询)扩展/主机

    我使用 PHP MySQL 开发了一个应用程序 该应用程序使用了彗星技术 即长轮询 概念验证效果很好 但我预计流量会快速达到数千个同时连接 网络服务器上的数千个开放连接 我没有能力设置自己的服务器 例如使用 lighttpd 并且通常依赖简
  • 将自定义侦听器添加到 Kotlin 类的正确方法

    我是 Kotlin 菜鸟 第三天 正在尝试向我的班级添加一个侦听器 我目前正在使用 lambda 如下例所示 它们工作得很好 Declare callback class Controller var onAction gt Use cal
  • 有符号和无符号整数表达式的比较

    我刚刚开始使用 OpenGL 这是我的第一个代码 OpenGL hello program include
  • 如何确定复选框列表已选中/选中 -

    当我执行代码时 我得到 4 个复选框 并且我选中 选择了所有 4 个复选框 当我尝试调试代码时 它确实算作我有 4 个复选框 但所有 4 个复选框都被选中 false 我在代码中缺少什么
  • 检测项目中的循环依赖

    上次我在我的项目中发现了循环依赖问题 我解决了我的问题 但是我希望将来避免这种情况 我想到了在我的所有项目中发现循环依赖项并给我反馈的插件 Example 文件a js var functionFromA require b js cons
  • 如何增加 SwiftUI 选择器中显示的最大行数?

    我正在尝试创建一个 SwiftUI 选择器 用户可以使用它来选择 1000 到 20000 之间的数字 以 1000 为增量 例如 1000 2000 3000 20000 默认情况下 SwiftUI 选择器只能容纳 10 行文本 如何允许
  • 保存数据的最佳方法 - 首选项、sqlite、可序列化还是其他?

    我一直在研究在回合之间保存游戏数据的替代方法 并且想知道是否有人可以为我指明正确的方向 我有大约 32k 的数据必须在 onPause 期间保存 由于数据量巨大 我排除了偏好 我花了几天时间研究 SQLite 但无法在不到两秒的时间内保存数
  • Shellcode:执行 2 次 execve() 调用

    我正在尝试用汇编语言编写 shellcode 我需要执行一个 usr bin killall命令与 usr bin wget命令 我的两个命令都在 shellcode 中完美运行execve 系统调用 但现在我想将这两个结合起来 但这是不可
  • 在 Node.js 中从 SQLite 获取表列表

    下面的代码仅返回第一个表的名称 如何获取现有表中所有可用表名称的列表sqlite const sqlite3 require sqlite3 verbose const db new sqlite3 Database path to myd
  • 如何提高 OpenMP 代码的性能?

    我目前正在尝试提高我的代码的并行性能 但我对 OpenMP 仍然是新手 我必须迭代一个大容器 在每次迭代中从多个条目读取并将结果写入单个条目 下面是我正在尝试做的一个非常简单的代码示例 data是一个指向数组的指针 其中存储了许多数据点 在
  • 使用 pip 安装 Twisted for Python:错误:Microsoft Visual Studio 失败,退出状态为 2

    当我尝试在运行 python3 7 的 Windows 10 计算机上安装 python 包 Twisted 时 我无法从 tarz 文件构建 Wheel 最终得到以下输出 C Program Files x86 Microsoft Vis
  • 如何使用 knit 和 pandoc 在 R Markdown 中包含 DT 数据表的 js 依赖项

    有没有办法在 RStudio 之外使用 DT 生成的数据表来编译 RMarkdown 文档 我试图在 RMarkdown 文档中包含一个数据表小部件 然后我想使用 knit 和 pandoc 将其转换为 html 这对于 RStudio 来
  • Datetime.ParseExact“字符串未被识别为有效的日期时间”错误

    为什么我无法解析这样的字符串 DateTime date DateTime ParseExact 23 02 2016 08 59 35 dd MM yyyy HH mm ss CultureInfo InvariantCulture 它抛
  • 如何将下面的JS转换为JQuery? [复制]

    这个问题在这里已经有答案了 我很难将以下 JS 转换为 JQuery 我的项目有一个 HoverMediv 将其悬停在其中以显示其中的内容 hidden div 我有一个运行良好的 JS 脚本 这个问题 作者 anied https sta
  • 如何将 Laravel 7 连接到 Microsoft SQL Server?

    我真的很惊讶 Laravel 文档对于解释如何连接到 MS SQL Server 的限制 我认为有两个区域需要配置 env 文件和database php 与 Laravel 7 相比 网络上的大多数示例都没有显示相同的格式 我想知道在哪里
  • 优化编译器中的常量组合

    我有一个包含许多小型内联函数的头文件 他们中的大多数碰巧拥有恒定的数据 由于这些函数对性能至关重要 因此它们处理常量的方式变得很重要 AFAIK 有两种方法来引用常量 1 在稍后与应用程序链接的单独源文件中定义它们 2 就地定义常量 我会选