总结面试时没有回答上的设置内存对齐方式问题

原创 2006年11月09日 16:18:00

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

问:下面这个结构类型的实例变量占用多少内存:
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之前记得让其指向所申请的内存的首地址上。

编写支持对其分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方整除

题目:《程序员面试金典(第5版)》P281     编写支持对其分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方整除...
  • bupt8846
  • bupt8846
  • 2014年11月20日 22:00
  • 631

[面试经]字节对齐

一、快速理解 什么是字节对齐? 在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单...
  • SunnyYoona
  • SunnyYoona
  • 2015年04月06日 17:04
  • 892

程序员面试金典: 9.13 C和C++ 13.9编写对齐的malloc和free函数。

#include #include using namespace std; /* 问题:编写支持对齐分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2017年01月15日 11:18
  • 288

内存对齐方式的总结 如何计算结构体所占内存的大小

具体的理论内容 神马是内存对齐以及为何要内存对齐请看http://blog.csdn.net/kokodudu/article/details/11918219 上面这个连接 将的相当理论 我给简化...
  • kokodudu
  • kokodudu
  • 2013年09月23日 12:24
  • 6071

Android事件分发机制总结

理解事件的分发机制,需要对View和ViewGroup事件的分发分别探讨。View和ViewGroup的区别,一个View控件是指它里面不能再包含子控件了,常见的如TextView、Button、Im...
  • shakespeare001
  • shakespeare001
  • 2016年03月27日 20:59
  • 1723

C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小

转载于:http://blog.csdn.net/dreamback1987/article/details/8504943 联合体 用途:使几个不同类型的变量共占一段内存(相互覆盖) 结构体是一...
  • debugingstudy
  • debugingstudy
  • 2013年10月12日 22:00
  • 2782

IT面试时常见问题及回答分析

  • 2013年12月01日 21:37
  • 28KB
  • 下载

面试时最难回答的25个问题

准备是成功的一半       如果你是一个对目前的职位不满意,正着手去在新的一年里找到一个新的职位,这篇文章就是你的一个帮手。工作面试是你去面对未来的老板的征途中最重要的一个过程。你必须像...
  • gybyylx
  • gybyylx
  • 2013年03月16日 19:42
  • 791

怎么在面试时回答java垃圾回收机制相关问题?

.笔试、面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见人心”。通过一、二个小时内的做题、交流,只是没有其他办法下进行的无奈之举,所以通过了面试不代表有多成功,没通过也...
  • lxyso
  • lxyso
  • 2016年04月05日 02:16
  • 696

hadoop面试时可能遇到的问题,你能回答出几个 ?

面试hadoop可能被问到的问题,你能回答出几个 ? 1、hadoop运行的原理? 2、mapreduce的原理? 3、HDFS存储的机制? 4、举一个简单的例子说明mapreduce是怎么来...
  • yorkingalan
  • yorkingalan
  • 2011年11月28日 00:06
  • 3416
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:总结面试时没有回答上的设置内存对齐方式问题
举报原因:
原因补充:

(最多只允许输入30个字)