struct A
{
char c; //1byte
double d; //8byte
short s; //2byte
char szBuf[5];
};
对齐参数设置为8byte,则,运行结果如下:
Len:24
1245032,1245040,1245048,1245050
Strua 的s分配后,接下来分配Strua 的数组szBuf[5],这里要单独分配它的每个元素,由于是char类型,所以N=min(1,8),取N=1,所以数组szBuf[5]的元素依次分配没有间隙。
看完上述的例子,基本分配的规律和方法应该已经知道.下面主要说明数组,嵌套结构体,指针时的一些内存对齐问题.
最重要的是自己写程序证明.
#include#include using namespace std; #pragma pack(8) struct Args { char ch; double d; short st; char rs[9]; int i; } args; struct Argsa { char ch; Args test; char jd[10]; int i; }arga; int main() { // cout < 输出结果: Args:32
10
Argsa:56
Argsa:12
Argsa:32
struct Args长度32 struct Argsa长度:56. 改成#pragma pack (16)结果一样. 这个例子证明了三点: 对齐长度长于struct中的类型长度最长的值时,设置的对齐长度等于无用. 数组对齐的长度是按照数组成员类型长度来比对的. 嵌套的结构体中,所包含的结构体的对齐长度是结构体的对齐长度.
3.指针.主要是因为32位和64位机寻址上 测试环境同2.(64位 系统)#include#include #pragma pack(4) using namespace std; struct Args { int i; double d; char *p; char ch; int *pi; }args; int main() { cout<<"args length:"<
设置pack为4时: args length:32
8
4
设置pack为8时: args length:40
8
8
看了上述内容,应该能分析出来为什么是这个结果.这里不详细描述.
3.不同编译器中内存对齐
VC 6.0上是8 byte
gcc 默认是8byte.测试版本gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 g++默认是8byte.测试版本g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 但查阅的资料说是gcc 默认是4,且不支持pragma参数设定.测试的时候gcc默认对齐为8byte且,支持pragma参数. 测试过两个不同的例子,结果相同.
4.什么时候需要进行内存对齐.
一般情况下都不需要对编译器进行的内存对齐规则进行修改,因为这样会降低程序的性能,除非在以下两种情况下:
(1)这个结构需要直接被写入文件;
(2)这个结构需通过网络传给其他程序;
5.不足之处.
没有类方面的内容.
位段问题.这个问题有点复杂
具体应用的案例.
欢迎拍砖,不喜口水!
参考: http://bbs.csdn.net/topics/30388330
http://blog.csdn.net/daliaojie/article/details/7516099
http://blog.csdn.net/cuibo1123/article/details/2547442
http://blog.csdn.net/mbh_1991/article/details/10241785
http://blog.csdn.net/xing_hao/article/details/6678048
http://developer.51cto.com/art/201002/183652.htm
http://m.oschina.net/blog/167508 p=2
http://blog.csdn.net/acorld/article/details/9104579
http://blog.csdn.net/anonymalias/article/details/8743857
http://www.dewen.org/q/5835/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E8%BF%9B%E8%A1%8C%E5%86%85%E5%AD%98%E5%AF%B9%E9%BD%90%E5%86%85%E5%AD%98%E5%AF%B9%E9%BD%90%EF%BC%9F sort=active
http://bbs.ednchina.com/BLOG_ARTICLE_92132.HTM
http://stackoverflow.com/questions/12881179/why-is-memory-alignment-required
http://stackoverflow.com/questions/381244/purpose-of-memory-alignment
http://blog.csdn.net/linuxblack125125/article/details/7849743