关于内存对齐的几个小问题
关于内存对齐的几个问题之前面试被问到内存对齐的相关知识,最近就大致查了查看了看感觉自己算是一知半解了
关于内存对齐的几个问题
之前面试被问到内存对齐的相关知识,最近就大致查了查看了看
感觉自己算是一知半解了
我想问一下 之前的开发中基本没用过内存对齐的操作
关于内存对齐的设定一般在什么情况下使用呢?
对齐系数的设定 遵循什么原则?这是不是要看要具体看结构体的定义了?
[解决办法]
#pragma pack(push,1) //2,4,8,16,32
#pragma pack(pop)
[解决办法]#include <stdio.h>
struct PD {
int c4;char c2;short c1;int c3;
} pd;
#pragma pack(push,1)
struct P1 {
int c4;char c2;short c1;int c3;
} p1;
#pragma pack(pop)
#pragma pack(push,2)
struct P2 {
int c4;char c2;short c1;int c3;
} p2;
#pragma pack(pop)
#pragma pack(push,4)
struct P4 {
int c4;char c2;short c1;int c3;
} p4;
#pragma pack(pop)
#pragma pack(push,8)
struct P8 {
int c4;char c2;short c1;int c3;
} p8;
#pragma pack(pop)
int main() {
printf("Default pack:%d\n",sizeof(pd));
printf(" 1 pack:%d\n",sizeof(p1));
printf(" 2 pack:%d\n",sizeof(p2));
printf(" 4 pack:%d\n",sizeof(p4));
printf(" 8 pack:%d\n",sizeof(p8));
return 0;
}
[解决办法]如果结构体变量的内容要通过二进制文件读写或网络收发,pack 1
[解决办法]一般网络数据传输的时候 会设置1字节对齐来减小一些传输量
[解决办法]重要补丁:减小传输量不是重要的;重要的是收发双方如果不采用1字节对齐,可能根本无法传输结构化数据。
[解决办法]这个程序太没效率了,在嵌入式系统中,这样是绝对不行的。
有些CPU取数据时是从地址是4的倍数取数据的,如果上面这样传入的地址不是4的倍数,那么很浪费CPU资源的。
所以我想面试你的这家公司应该是嵌入式相关的公司。
[解决办法]1字节对齐只是双方的一个约定
只要双方都是按照约定的格式来发送数据,难道2字节对齐的就发不了了?
[解决办法]为啥就没人认真回答下呢?难道都不知道么?也怨不得8楼了
以32位系统为例,总线是32位的,也就说每次读取4个字节,如果你按4字节对齐,这样保证了读写1个指令就可以完成,如果没有,比如说起始地址是3,这样就需要读写2次,降低了效率
[解决办法]用不同的CPU或操作系统或编译环境,就算都设定2字节对齐,实际结果也可能各不相同。
[解决办法]