#pragma pack(n) 和#pragma pack() 您所在的位置:网站首页 int占几位 #pragma pack(n) 和#pragma pack()

#pragma pack(n) 和#pragma pack()

2023-07-07 00:16| 来源: 网络整理| 查看: 265

#pragma pack(n) 和#pragma pack()   强制C编译器以n字节进行对其,

比如我们在32位的操作系统中,结合以下两个例子进行分析

typedef define { int a; short b; char c; }stru_test1; printf("stru_test1所占字节数为%d\n",sizeof(stru_test1)); typedef define { short b; int a; char c; }stru_test2; printf("stru_test2所占字节数为%d\n",sizeof(stru_test2));

那么上面代码在进行编译运行之后,stru_test1和stru_test2所占字节的大小为多少呢?

运行后

stru_test1所占字节数为:8

stru_test1所占字节数为:12

是不是可能感觉不知道为什么是8和12,下面来进行解释说明:

C编译器在编译时为了提高代码的运行效率,会对结构体进行优化,成员变量按照4字节进行对齐,对于int、short、long等类型,在结构体空间中以偶数地址为起始开始存放,且一次性连续存放完。

stru_test1所占空间大小以及成员变量在存储空间中的分布

一个方格代表一个字节

stru_test2所占空间大小以及成员变量在存储空间中的分布

一个方格代表一个字节

而#pragma pack(1)让编译器将结构体数据强制连续排列,设置内存对齐为:1字节对齐。 意思就是 以下代码编译出来的是以1个字节的方式对齐的。这样能节约内存资源,但是会在效率上有所影响

#pragma pack(1) typedef define { int a; short b; char c; }stru_test1; typedef define { short b; int a; char c; }stru_test2; #pragma pack() printf("stru_test1所占字节数为%d\n",sizeof(stru_test1)); printf("stru_test2所占字节数为%d\n",sizeof(stru_test2));

此时编译运行之后stru_test1所占字节大小和stru_test2所占字节大小一样,都是7个字节。

注意:#pragma pack(n)的使用格式为

#pragma pack(n)

/*  code  */

#pragma pack()

原文链接:https://blog.csdn.net/Roger_717/article/details/125180831



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有