字节对齐
来源:互联网 发布:seo sem 新媒体 电商 编辑:程序博客网 时间:2024/06/04 00:33
Intel、微软等公司曾经出过一道类似的面试题:
#include
#pragma pack(8)
struct example1
{
short a;
long b;
};
struct example2
{
char c;
example1 struct1;
short e;
};
#pragma pack()
int main(int argc, char* argv[])
{
example2 struct2;
cout << sizeof(example1) << endl;
cout << sizeof(example2) << endl;
cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;
return 0;
}
问程序的输入结果是什么?
答案是:
8
16
4
面试题的解答
至此,我们可以对Intel、微软的面试题进行全面的解答。
程序中第2 行#pragma pack (8)虽然指定了对界为8,但是由于struct example1 中的成员最大
size 为4(long 变量size 为4),故struct example1 仍然按4 字节对界,struct example1 的size
为8,即第18 行的输出结果;
struct example2 中包含了struct example1,其本身包含的简单数据成员的最大size 为2(short
变量e),但是因为其包含了struct example1,而struct example1 中的最大成员size 为4,struct
example2 也应以4 对界,#pragma pack (8)中指定的对界对struct example2 也不起作用,故19 行的
输出结果为16;
由于struct example2 中的成员以4 为单位对界,故其char 变量c 后应补充3 个空,其后才是
成员struct1 的内存空间,20 行的输出结果为4。
union A
{
int a[5];
char b;
double c;
};
struct B
{
int n;
A a;
char c[10];
}
sizeof(B) = ?
答案:
union A:
{
int a[5]; //20
char b; //1
double c; //8
}
我想的是union中变量共用内存,应以最长的为准,那就是20。可实际不然,sizeof(A)=24,
A中各变量的默认内存对齐方式,必须以最长的double 8字节对齐,故应该是sizeof(A)=24。
struct B
{
int n; // 4字节
A a; // 24字节
char c[10]; // 10字节
};
实际占用38字节,但由于A是8字节对齐的,所以int n和char c[10]也需要8字节对齐,总共8+24+16=48
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- 字节对齐
- &和&&的区别
- Jenkins的安装与系统配置
- iOS开发根本布景介绍
- 记录一次“任意文件下载”高危漏洞
- WebService:简介
- 字节对齐
- NumPy学习 -- 001_数组
- C++11 元编程 判断是否有std::hash<T>特例并提供hash函数通用实现
- Linux日志系统(Logcheck)的安装预配置
- ActiveMQ的安全配置
- 图解Android - Zygote, System Server 启动分析
- php foreach 意外情况简述
- 测试
- 安装g++