首页 技术 正文
技术 2022年11月15日
0 收藏 432 点赞 4,318 浏览 1406 个字

在linux下c语言结构体对齐:

1.自然对齐

struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float 等)的变量,也可以是一些复合数据类型(如array、struct、union 等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。 
自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size 最大的成员对齐。注:这里的最大指整形数据,实型,结构体成员不在此例。

2.#pragma pack(n) 告诉编译器按照n个字节进行对齐

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1)
typedef struct NODE
{
int a;
double b; char d[];
long e;
long long f;
short g;
float h;
long double i;
long int j;
char *c;
}Node;
#pragma pack()
int main()
{
Node *node;
node = malloc(sizeof(Node));
memset(node,,sizeof(Node));
printf("int sizeof a = %lu\n",sizeof(node->a));
printf("double sizeof b = %lu\n",sizeof(node->b));
printf("char * sizeof c = %lu\n",sizeof(node->c));
printf("char sizeof d = %lu\n",sizeof(node->d));
printf("long sizeof e = %lu\n",sizeof(node->e)); printf("long long sizeof f = %lu\n",sizeof(node->f));
printf("short sizeof g = %lu\n",sizeof(node->g));
printf("float sizeof h = %lu\n",sizeof(node->h));
printf("long double sizeof i = %lu\n",sizeof(node->i));
printf("long int sizeof j = %lu\n",sizeof(node->j));
printf("total size = %lu\n",sizeof(Node));
return ;
}

上面程序不包含pragram(1)的输出结果是

结构体对齐及#pragma详细解释

包含pragra(1)的输出结果是

结构体对齐及#pragma详细解释

结果分析:

  type 字节 without-pragma with-pragma  
a int  4 8 4  
b double 8 8 8  
c char * 1 8 1  
d char[] 11 16 12  
e long 8 8 8  
f long long 8 8 8  
g short 2 8 1  
h float 4 8 4  
i long double 16 16 16  
j long int 8 8 8  
total   70 96 77  

是在windows环境下配置的cygwin,所以对齐方式则是以最大的内置类型的字节数对齐,所以默认为8,有#pragma pack(1) ,那么其默认对齐方式是1个字节。

如有不对–请纠正!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,954
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,479
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,291
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,108
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,740
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,774