GCC 对弱 const 变量的优化错误

2023-12-30

我有一种奇怪的感觉gcc处理事情时的行为弱常量变量在不同的优化级别(即-O0 or -O1).

这是代码:

def.h:声明

const int var;
int copy;
int do_copy(void);

weak.c: weak var定义,do_copy实施做copy = var

#include "def.h"
const int __attribute__((weak)) var = 1;
int do_copy(void)
{
    copy = var;
    return var;
}

main.c: 强的var的定义和使用do_copy

#include <stdio.h>
#include "def.h"
int copy = 0;
int copy2 = 0;
const int var = 2;
int main(void)
{
    copy2 = do_copy();
    printf("copy=%d, copy2=%d\n", copy, copy2);
    return 0;
}

从这个“main.c”代码中,我期待两者copy and copy2留住强者var价值,存在2.

这是带有一个的输出-O0优化:

$ gcc -O0 -c main.c -o main0.o
$ gcc -O0 -c weak.c -o weak0.o
$ gcc main0.o weak0.o -o main0
$ ./main0
copy=2, copy2=2

这是预期的结果。

这是带有一个的输出-O1优化:

$ gcc -O1 -c main.c -o main1.o
$ gcc -O1 -c weak.c -o weak1.o
$ gcc main1.o weak1.o -o main1
$ ./main1
copy=1, copy2=2

This is 意外: while copy2确实保留了强大的价值(2), copy实际上设置为弱值(1)!

在“weak.c”文件中,它看起来像var总是被评估为1.
我的看法是var被宣布const,编译器认为它的值永远是1并对整个文件进行此优化(除了return陈述)。因此,它错过了弱/强的事情,并且不关心“main.c”中的强重新定义!

该问题可以通过以下方式解决:

  • 设置弱定义(const int __attribute__((weak)) var = 1;)在一个单独的文件中,说“weak2.c”。
  • 不做var持续的 (这可能是不可接受的!): const int var;--->int var;.

尽管如此,这看起来还是一个gcc对我来说很麻烦,但我错过了什么吗?

附录:

这是使用的版本gcc:

$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

None

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

GCC 对弱 const 变量的优化错误 的相关文章

随机推荐

  • 如何在 Visual Studio Code 中进行 git Push?

    有一个 推送 菜单项 但是当我单击它时 除了出现一个微妙的进度条并且从未完成之外 什么也没有发生 从 Visual Studio Code 的文档页面中 我发现了这一行 VSCode 目前不处理凭据管理 并且该页面链接到凭据助手上的 Git
  • ko.validation.group 没有检测到我的嵌套 observableArray 上的错误

    我使用 Durandal Breeze 开发了一个使用密集型 Knockout 绑定的项目 我有一个使用以下可观察的视图 packing description weight isotopes name activity 正如你在上面看到的
  • 为什么不能从 unique_ptr 构造出weak_ptr?

    如果我理解正确的话 weak ptr不会增加托管对象的引用计数 因此它不代表所有权 它只是让您访问一个对象 该对象的生命周期由其他人管理 所以我真的不明白为什么weak ptr不能由unique ptr 但只有一个shared ptr 有人
  • 如何获取 Tensorflow 2.0 中的其他指标(不仅仅是准确性)?

    我是 Tensorflow 领域的新手 正在研究 mnist 数据集分类的简单示例 我想知道除了准确性和损失 并可能显示它们 之外 如何获得其他指标 例如精度 召回率等 这是我的代码 from future import absolute
  • 在 Python 和 Pandas 中使用 dd.mm.yyyy 读取 csv

    我正在读取德国日期格式的 csv 文件 看起来在这篇文章中效果很好 使用 pandas python 从导入的 CSV 中选择日期 https stackoverflow com questions 28025671 picking dat
  • android.location.Location 设置器未按预期工作

    我需要根据一些纬度和经度值创建一个位置对象 而不需要通过位置提供程序 我执行以下操作 Location l new Location l setLatitude 32 l setLongitude 43 但是 这些值设置不正确 因为两者ge
  • 节点包 (Grunt) 已安装但不可用

    我正在尝试建立一个github jquery ui 库 https github com jquery jquery ui using grunt 但是运行后npm install我仍然无法按照以下命令运行命令自述文件 https gith
  • 在 Java 上提取形状特征的傅里叶变换和傅里叶描述符

    我正在尝试构建一个简单的系统来使用傅立叶描述符识别简单的形状 我在我的程序中使用快速傅立叶变换的实现 链接如下 http www wikijava org wiki The Fast Fourier Transform in Java 28
  • 如何通过现有对象上的表达式树调用构造函数?

    我试图为已经存在的对象调用反序列化构造函数 如何使用表达式树做到这一点 I tried Create an uninitialized object T graph T FormatterServices GetUninitializedO
  • 为什么我的卸载方法没有被调用?

    我的 VS 2008 创建的安装程序不调用覆盖Uninstall我的安装程序类中的方法 为什么 这Install方法被调用 我的安装程序类如下所示 RunInstaller true public partial class Install
  • Android 版 Firefox 中 onload 事件期间 window.innerWidth 的值错误?

    好的 我面临的问题是 我的移动 Firefox 浏览器无法检索正确的值window innerWidth document documentElement clientWidth 或者甚至是a的宽度div样式设置为在页面加载后占据整个客户端
  • Bash 命令行参数,替换变量的默认值

    我有一个脚本 其中有多个输入文件 通常这些文件是存储在标准位置并由脚本调用的默认值 但是 有时需要使用更改的输入来运行它 在脚本中 我当前有三个变量 A B 和 C 现在我想用非默认的 B 运行它 明天我可能想用非默认的 A 和 B 运行它
  • 在 VS2012 中发布构建事件..运行批处理文件

    我正在尝试在 Visual Studio 中的构建后事件中运行批处理文件 推荐我们可以在 Visual Studio 中的构建后事件命令行中执行 bat 文件吗 https stackoverflow com questions 14913
  • FBAudience Network 作为框架集成

    我正在将 Facebook Audience Network 集成到插页式和奖励类型的广告中 我正在尝试将其集成为框架而不是项目中 当我尝试通过测试用例测试它时 它在这一行之后失败 self fbInterstitialAd FBInter
  • Python中N-Gram、tf-idf和Cosine相似度的简单实现

    我需要比较存储在数据库中的文档并得出 0 到 1 之间的相似度分数 我需要使用的方法必须非常简单 实现普通版本的 n gram 可以定义使用多少克 以及 tf idf 和余弦相似度的简单实现 有什么程序可以做到这一点吗 或者我应该从头开始写
  • DrawUserPrimitives无效操作异常

    我试图在 XNA 中使用以下代码绘制一个三角形 VertexPositionColor vertices new VertexPositionColor 3 vertices 0 Position new Vector3 0 5f 0 5f
  • 动画 UIView 过渡,例如将点扩展为圆圈

    在我的 iPhone 应用程序中 我需要实现不同类型的转换 那是 从当前视图打开下一个视图 它像一个点 并且点像一个圆圈一样慢慢扩大 在圆圈中下一个视图将部分显示 最后圆圈完全扩大 下一个视图完全显示 我搜索了很多像 CATransitio
  • 插入sql数据库时处理大量数据

    在我的代码中 用户可以上传一个 Excel 文档 希望包含其电话联系人列表 作为开发人员 我应该读取该 Excel 文件 将其转换为数据表并将其插入数据库 问题是 一些客户有大量的联系人 比如 5000 个甚至更多的联系人 当我尝试将这么多
  • 使用 COALESCE 函数在变量中附加消息

    下面是我的代码 DECLARE msg NVARCHAR MAX NULL WITH CTE AS SELECT A AS Message UNION SELECT B AS Message UNION SELECT C AS Messag
  • GCC 对弱 const 变量的优化错误

    我有一种奇怪的感觉gcc处理事情时的行为弱常量变量在不同的优化级别 即 O0 or O1 这是代码 def h 声明 const int var int copy int do copy void weak c weak var定义 do