联合内位域的对齐

2024-01-09

我对以下代码如何在内存中布局感到有点困惑:

struct Thing
{
    union
    {
        unsigned value:24;
        uint8_t bytes[3];
    };
    Thing(int v)
            :value(v)
    {}

    void foo()
    {
        printf("Thing %p value=%d !\n", this, value);
    }

} __attribute__((__packed__));

在 Linux 上的 gcc 3.3、4.3 或 4.6 上(我能想到的没有任何特殊选项 - 4.6 上只有“-Wall -g”),结构的大小始终为 4:

$ pahole ./union
struct Thing {
        union {
                unsigned int               value;                /*           4 */
                unsigned char              bytes[3];             /*           3 */
        };
[...]

我们这里有一些类似的代码,其中结构体中有无符号值:24,有人添加了联合并无意中将结构体的大小从 3 字节增加到 4 字节。 如果我尝试将联合定义为“打包”,也会发生同样的事情 - 大小仍然是 4。这种行为是否符合 C++ 规范?该怎么解释呢?

稍后编辑:将“C 规范”替换为“C++ 规范”。


您错过了匿名联合的打包属性。考虑这个例子:

#define PACKED __attribute__((__packed__))
struct S1 { unsigned value:24; } PACKED ;
struct S2 { union { char a[3]; unsigned value:24; };  } PACKED ;
struct S3 { union { char a[3]; unsigned value:24; } PACKED ;  };


int main() {
   std::cout << sizeof(S1) << std::endl;
   std::cout << sizeof(S2) << std::endl;
   std::cout << sizeof(S3) << std::endl;
}

Output:

3
4
3

打包属性有点奇怪,我总是尝试测试每种可能的组合以获得正确的结果。

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

联合内位域的对齐 的相关文章

  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐

  • Azure WebJobs:具有不同批量大小的队列触发器

    我在 azure 上有一个 WebJob 它同时处理来自多个队列的消息 public async static Task ProcessQueueMessage1 QueueTrigger queue1 string message swi
  • 我怎样才能从 Youtube api 检索版权问题?

    我尝试使用 Youtube data api 获取一些 Youtube 视频信息 我特别想知道如何检索盗版信息 我检查了下面的参考 但我不知道怎么办 https developers google com youtube v3 https
  • 减少“读取时”循环的处理时间

    shell 脚本新手 我有一个巨大的 csv 文件 其长度 f11 不同 例如 000000aaad000000bhb200000uwwed 000000aba200000bbbrb2000000wwqr00000caba2000000bh
  • 如何使用 Ruby 将一行中的多个换行符替换为一个换行符

    我有一个用红宝石编写的脚本 我需要删除任何重复的换行符 例如 n n n to n 我当前的尝试有效 或者更确切地说没有 使用 str gsub n n n 这并没有改变我的输出 我究竟做错了什么 这对我有用 usr bin ruby s
  • 如何异步下载 ListView HTML 图像?

    作为原型 我正在尝试修改android imagedownloader 演示 http code google com p android imagedownloader 来自Android 开发者博客 http android devel
  • Python Flask WTForms:如何在视图中动态禁用字段?

    我已经能够实施这个变化 https stackoverflow com questions 14874846 python flask wtforms make read only textfield创建在 WTForms 中禁用的字段 在
  • 使用 npm init react-app 时 Docker 容器启动后立即退出

    我正在尝试使用 React 项目启动 Docker 容器 该项目是使用 npm init react app 创建的 这是我的 docker 文件 Specify a base image FROM node alpine WORKDIR
  • 无法在 Android Oreo 更新中保存图像文件。怎么做?

    我无法在 android oreo 8 0 api 26 中保存图像文件 该代码在 api 级别 25 7 0 中完美运行 我在文档中没有发现任何更改 Android 8 0 行为变更 https developer android com
  • 如何在 play 框架 scala ws 调用中忽略 ssl 验证

    我想要使 用使用无效证书 自签名 的 Web 服务 我想在不执行任何类型的证书验证的情况下进行 Web 服务调用 我该怎么做 在您的 application conf 中添加以下行 ws acceptAnyCertificate true
  • 数据库或 Web 应用程序中的分页选择

    我正在考虑重新设计我们网站的报告页面以使其更快 但我对应该如何实现分页持观望态度 我们的数据库很大 超过 1 5 亿条记录 我们的大多数报告需要来自最多 5 到 10 个表的复杂数据 因此每个表可能有 5 或 6 个联接和一些内部选择 显然
  • 如何在从 Linux 移植的 C++ 项目中使用 OpenGL

    我只是尝试在我的 Mac 上编译一个开源 C 应用程序 我收到错误 GL gl h 文件未找到 我知道这意味着它找不到需要编译和运行的 open GL 库 我对下一步该做什么感到困惑 因为 看起来 OS X 内置了对 open gl 的支持
  • AspNetCore中间件UserManager依赖注入

    我有一个多层应用程序 是我开始在 ASP NET Core 1 1 中编写的 我仍在不断学习 我像以前在 Web API 中所做的应用程序一样组织它 我有主机服务 网络核心应用程序 业务层和数据库之上的数据层 业务层和数据层是 net co
  • JQuery/Javascript 重新排序行

    我有一个 aspx 页面 看起来像这样 tr td Some label td td Some complex control td tr tr td Some label td td Some complex control td tr
  • 同一类上的两个类别具有相同的方法名称

    我注意到 UIImageView 上的 AFNetworking 和 SDWebImage 类别具有相同的方法名称 AF网络 void setImageWithURL NSURL url self setImageWithURL url p
  • Django 站点地图和“普通”视图

    也许我不明白站点地图的目的 或者也许我不明白如何使用站点地图 现在 我的站点地图包括所有 动态 创建的页面 例如博客文章 但是如何添加 静态 页面 例如我的索引和联系页面 或者这些视图不应该出现在站点地图中吗 我认为所有页面都应该在站点地图
  • 将文件解压到内存的最佳 Api

    我正在开发一个 Qt 应用程序 我们必须读取压缩文件或 QByteArrays 并将它们解压缩到内存中 读取文件内容而不实际将文件解压缩到磁盘 有没有好的sdk可以轻松实现这一点 我们目前使用 QArchive 无错误 但我们发现它根本不是
  • 通过命令行运行时如何连接到数据库

    当我从浏览器运行 zend 框架项目时 一切正常 它连接到数据库 当我从命令行运行项目时 它无法连接到数据库并引发错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE HY000 2002 没有这样的文件或目录
  • 测试中的 NestJS 全局模块

    有没有办法自动提供所有 Global模块成TestModule 即无需导入它们 与主应用程序的工作方式相同 到目前为止 我必须确保将任何全局模块插入到import我的通话清单 await Test createTestingModule i
  • 尝试使用 linq 转换数据[重复]

    这个问题在这里已经有答案了 我有以下类结构 public class TaskLog public DateTime LogDate get set public string Robot get set public string Tas
  • 联合内位域的对齐

    我对以下代码如何在内存中布局感到有点困惑 struct Thing union unsigned value 24 uint8 t bytes 3 Thing int v value v void foo printf Thing p va