联合内位域的对齐

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(使用前将#替换为@)

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

随机推荐

  • 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