//sizeof面试题1.cpp
//What is the output of the following code?
//[美国某著名计算机软硬件公司面试题]
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct{
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
int main()
{
char* ss1="0123456789";
char ss2[]="0123456789";
char ss3[100]="0123456789";
int ss4[100];
char q1[]="abc";
char q2[]="a\n";
char* q3="a\n";
char* str1=(char*)malloc(100);
void *str2=(void*)malloc(100);
cout<<sizeof(ss1)<<" ";
cout<<sizeof(ss2)<<" ";
cout<<sizeof(ss3)<<" ";
cout<<sizeof(ss4)<<" ";
cout<<sizeof(q1)<<" ";
cout<<sizeof(q2)<<" ";
cout<<sizeof(q3)<<" ";
cout<<sizeof(A)<<" ";
cout<<sizeof(B)<<" ";
cout<<sizeof(str1)<<" ";
cout<<sizeof(str2)<<" ";
return 0;
}
//解析:
//ss1是一个字符指针,指针的大小是一个定植,就是4。
//q2里面有一个"\n","\n"算做一位,所以它的空间大小是3。
//A 和B是两个结构体。在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都
//小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构体的长度一定是
//最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐
//单位。但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。
//
//结构体A中有3个short类型变量,各自以2字节对齐,结构体对齐参数按默认的8字节对齐,则a1、a2、a3都
//取2字节对齐,sizeof(A)为6,其也是2的整数倍。B中a1为4字节对齐,a2 为2字节对齐,结构体默认对齐参数
//为8,则a1取2字节对齐;结构体大小6字节,6不为4的整数倍,增加到8时,符合所有条件,则sizeof(B)为8。
//
//CPU的优化规则大致原则是这样的:对于n字节的元素(n=2,4,8,...) ,它的首地址能被n整除,才能获得最好的
//性能。设计编译器的时候可以遵循这个原则:对于每一个变量,可以从当前位置向后找到第一个满足这个条件
//的地址作为首地址。例子比较特殊,因为即使采用这个原则,得到的结果也应该为6(long的首地址偏移量0000
//,short首地址偏移量0004,都符合要求)。但是结构体一般会面临数组分配的问题。编译器为了优化这种情况,
//干脆把它的大小设为8,这样就没有麻烦了,否则的话,会出现单个结构体的大小为6,而大小为n的结构体
//数组大小却为8*(n-1)+6的尴尬局面。IBM出这道题并不在于考查理解语言本身和编译器,而在于应聘者对
//计算机底层机制的理解和设计程序的原则。也就是说,如果让你设计编译器,你将怎样解决内存对齐的问题。
评论0