首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 总结面试时没有回答上的内存对齐问题
【标  题】:总结面试时没有回答上的内存对齐问题
【关键字】:
【来  源】:http://blog.csdn.net/happyhippy/archive/2006/11/09/1375768.aspx

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

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

问:下面这个结构类型的实例变量占用多少内存:
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);
农历中天干地支的计算【C代码】:【上一篇】
农历算法简介以及公式:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • TStaticTextEx & TDBStaticTextEx 组件
  • 浅析手机病毒原理及特性
  • [转帖]JAVA编程规则
  • 向cvs管理文件传递参数
  • 华为Radius认证、计费报文入门
  • IE编程经验总结(二)——聊天室自动发言
  • Linux ftp 配置
  • Java API设计指南(二)
  • 配置用于OpenBSD(3.9)的PXE网络启动,FTP安装服务器(PDF下载)
  • 名词解释:什么是RSS?
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.