minGW: 记录windows下minGW的一个问题
如下所示:
#include <stdio.h> /*编译器默认是4字节对齐*/ struct test{ char a; int b; }; /*按实际占用的空间大小*/ struct test1{ char a; int b; }__attribute__((packed)); /*结构体大小必须4字节对齐*/ struct test2{ char a; int b; }__attribute__((aligned(4))); /*结构体大小必须8字节对齐*/ struct test3{ char a; int b; }__attribute__((aligned(8))); /*结构体大小必须16字节对齐*/ struct test4{ char a; int b; }__attribute__((aligned(16))); /*int 类型数据大小必须8字节对齐*/ struct test5{ char a; int __attribute__((aligned(8))) b; }; int main() { printf("test:%d\n",sizeof(struct test)); printf("test1:%d\n",sizeof(struct test1)); printf("test2:%d\n",sizeof(struct test2)); printf("test3:%d\n",sizeof(struct test3)); printf("test4:%d\n",sizeof(struct test4)); printf("test5:%d\n",sizeof(struct test5)); return 0; }
struct test1 本以为会占用5个字节,但是使用minGW编译运行后,发现实际输出的结果如下:
[Running] cd "c:\Users\nisha_chen\Desktop\byteAlign\" && gcc byte_align.c -o byte_align && "c:\Users\nisha_chen\Desktop\byteAlign\"byte_align
test:8
test1:8
test2:8
test3:8
test4:16
test5:16
实际占用长度为8个字节,把上述code 复制到 linux下编译运行后,提到的结果 仍为 5 个字节, 说明code本身是没有问题的。参考了一些链接,有说是minGW bug的,有说是写法有问题的。
不过看到有一个写法可能得到正确的结果:
attribute packed is broken on mingw32 compilers. Another option is to use pragma pack:
#pragma pack(1)
typedef struct _file
{
uint8_t var1;
uint16_t var2;
} FILE;
就是加上 #pragma pack(1)。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
分类:
IDE-Codeblocks
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2020-09-03 android: View的生命周期