首页 技术 正文
技术 2022年11月21日
0 收藏 510 点赞 4,088 浏览 2230 个字

为了让CPU能够更舒服地访问到变量,struct中的各成员变量的存储地址有一套对齐的机制。
这个机制概括起来有两点:
第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足;
第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充。
各种类型的变量的align值如下,参考的是wikipedia的页面:
—————————————————————————————-
Data structure alignment
The following typical alignments are valid -bit x86:
A -byte aligned.
A -byte aligned.
An -byte aligned.
A -byte aligned.
A –byte aligned on Linux.
A -byte aligned on Linux.
Any pointer (four bytes) will be -byte aligned on Linux. (eg: char*, int*)
The only notable difference -bit linux system when compared to a bit is:
A -byte aligned.
A -byte aligned.
Any pointer (eight bytes) will be -byte aligned.
—————————————————————————————-
这里写了个程序来验证这些事:
#include <stdio.h>

struct s {
char a;
short b;
char c;
double d;
char e;
};

int main() {

struct s s1;

printf(“%d, %d, %d, %d, %d\n”,
(char*)(&s1.a) – (char*)(&s1),
(char*)(&s1.b) – (char*)(&s1),
(char*)(&s1.c) – (char*)(&s1),
(char*)(&s1.d) – (char*)(&s1),
(char*)(&s1.e) – (char*)(&s1));
printf(“%d\n”, sizeof(struct s));

;
}

在64位linux下面运行这段代码的结果是:

, , , ,

由于对齐机制的存在,实际上上面的struct在内存中是长这个样子的,共计24个字节:
查看源代码
打印帮助
struct s {
char a; //在地址为0的位置
]; //由于下面一个元素是short,对齐字节数为2的位数,需要补1字节
short b; //对齐到了地址为2的位置
char c; //在地址为4的位置
]; //由于下面一个元素是double,对齐字节数为8的倍数,需要补3字节
double d; //对齐到了地址为8的位置
char e; //在地址为16的位置
]; //整个struct的大小需要是对齐数最大者,也就是double的8字节的整数倍
};
       ____________________________________________________________________________________________
       |       |////////|         |         |              |                |        |            |
       |   a   |padding1|    b    |    c    |    padding2  |        d       |    e   |padding3    |
       |       |////////|         |         |              |                |        |            |
       +——————————————————————————————+
 Bytes:    1        1        2          1            3            8            1            7
如果是在32位的linux下跑上面的程序,由于double的长度还是8字节,但是对齐是4字节的了,所以前面几个成员的位置不变,
而最后的padding只需要补3个字节就可以了,所以输出的结果是0, , , , 16及20.
对于windows,其32位和64位下double都是8字节对齐的,所以在32位和64位下跑这个程序结果都是0, , , , 16及24.
最后,整个struct的大小的要求是对齐值最大者的整数倍,没有什么默认的4或者8的倍数一说。如果把上面程序中的a,b,c,d,e的
类型全变成char,那么最后的他们的地址会是0,,,,,整个struct的大小 sizeof(struct s)的值是5,没有任何padding发生。
以上程序实验的环境在64位centos x64上的gcc (32位结果加-m32参数)及Visual Studio 2008上得出。

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