博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
总结面试时没有回答上的内存对齐问题
阅读量:6718 次
发布时间:2019-06-25

本文共 1233 字,大约阅读时间需要 4 分钟。

前两天面试某公司时,没有回答上的一个问题,总结如下,以供参考。

问:下面这个结构类型的实例变量占用多少内存:
struct struct1
{
    int i;
    short j;
    char c;
};
我反问:是啥语言啥机器啥编译环境?
他回答说:VC6.0下。
我:内存对齐后占8byte。
他又继续问:如何让它只占7byte?
我的第一反应是使用位段,正准备回答,又感觉不对,位段不能让它不对齐啊。又想了几秒钟,还是不会,只好回他说没玩过……
今天下午去图书馆翻了下《代码优化:有效使用内存》,发现里面提到了两种方法:
法1:
#pragma pack(push)
#pragma pack(1)
struct struct1
{
    int i;
    short j;
    char c;
};
#pragma pack(pop)
法2:
修改编译指令的参数,来禁止内存对齐:
VC++             :/Zn1(VS2005下,右击项目-属性-配置属性-C/C++-代码生成-结构成员对齐-选“1字节(/Zn1):”(即禁止内存对齐),默认是使用默认值,即按照结构中占用空间最大的成员进行对齐。的size进行对齐。
Borland C++ : /-a1
法2是对整个项目禁用内存对齐,而法1可以针对特定的结构禁用内存对齐,其提供了更大的灵活性.
另外,该书中还提到:
char不对齐;
short沿偶地址对齐;
int/float沿取值为4的倍数的地址对齐。
double沿取值为8的倍数的地址对齐。
VS2005下,默认是使用默认值,即按照结构中占用空间最大的成员进行对齐,我们可以测试下面这个结构:
struct struct2
{
    char i;
    short d;
    double c;
    short j;
};
//保持为默认值或修改编译参数/Zn?,猜下sizeof结果为多少?:)
printf("struct2:%d\n",sizeof(struct2));
struct2 st;
printf("%p\n",&st.i);
printf("%p\n",&st.d);
printf("%p\n",&st.c);
printf("%p\n",&st.j);

 

补充:数据的手工对齐:

char *p;

int temp = align_power-1;
p=(char*)malloc(need_size + temp;
p=(char*)malloc(((int)p+temp)&temp);//修改了p,所以释放p前记得要归位
注:align_power是所需要的对齐幂,char*(也可以为int*)是指针类型。另外,释放p之前记得让其指向所申请的内存的首地址上。

本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2006/11/10/601224.html,如需转载请自行联系原作者
你可能感兴趣的文章
HTML5之Canvas标签简要学习
查看>>
du熊学斐波那契I
查看>>
Silverlight1.1架构图
查看>>
js实现获取值传到input里边
查看>>
【原+转】用CMake代替makefile进行跨平台交叉编译
查看>>
swift3.0:CoreData的使用
查看>>
Silverlight实用窍门系列:3.Silverlight鼠标动态绘制矩形【实例源码下载】
查看>>
postmaster.c 中的 ListenAddresses
查看>>
托付和事件的使用
查看>>
关于Java的转义字符
查看>>
测试管理工具QC使用指南--QC用户
查看>>
使用FDO API连接到各种数据源
查看>>
CentOS 6.5下Redis安装记录
查看>>
Activiti-5.3工作流引擎-源码解析(流程文档解析)
查看>>
python3中的迭代器与生成器
查看>>
开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))...
查看>>
在虚拟机中搭建SQLITE环境,并测试其是否安装成
查看>>
jsp页面传递参数是如何与javabean进行关联的
查看>>
Sql Server的弱口令入侵测试以及防范
查看>>
IE浏览器开启对JavaScript脚本的支持
查看>>