sizeof题目

写出下面代码的输出结果:

#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; struct{ }C; class D{ }; class E{ int a1; static int a2; }; 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"; 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(C) << ""; cout << sizeof(D) << ""; cout << sizeof(E) << ""; return 0; }

  • ss1,这是一个指针,所以长度为4
  • ss2,这是一个数组但是没有指定长度,所以由后面的“0123456789”决定,长度为10+1(/0)=11
  • ss3,长度制定了的数组,为100
  • ss4,长度制订了的数组,同时int占四个word,所以为4*100=400
  • q1,如ss2,为4
  • q2,由于/n占一个word,所以为3(不要忘了/0)
  • q3,如ss1,为4
  • 对于A,B的长度:对于结构体,一般会将数据的长度对齐。如果所有数据的长度小于处理器的位数时,则以所有数据的最长长度为对齐长度。如果有数据的长度超过处理器的位数时,则以处理器的位数对齐。所以这里的A是三个short于是长度为6,而B最小需要6word,但是由于对齐的关系,short实际放在4字的内存中,所以为8
  • C,D:对于一个类或者struct来讲,即使它没有任何内容,任然拥有1的空间,所以为1
  • E,对于static变量,由于全局变量是放在全局存储区的,而sizeof只是计算栈中分配的内存,所以static变量不需要计入在内,所以为4

关于数据对齐:CPU的优化规则大致是:对于n字节的元素,他的首地址能被n整除才能获得最好的性能。编译器可以遵循这样一个原则:对于每个变量,可以从当前位置向后找到第一个满足的地址最为首地址。不过结构体一般会面临数组分配的问题,所以编译器为了优化这种情况,干脆把所有数据对于最长的数据对齐。

另外有关sizeof的

  • sizeof的结果类型是size_t,它的类型是unsigned int
  • sizeof还可以用函数做参数,比如:short fun(); printf("%d/n",sizeof(fun())); 输出结果等同于sizeof(short)
  • 大部分编译程序在编译时就将sizeof计算好了,这说明sizeof无需执行就可以计算了
  • 对于内存不确定的数据,sizeof不能使用,比如:未知存储大小的数组,void类型等
  • 如果是函数传入的参数比如讲如下的代码:char c[10]; int test(char c[]) { return sizeof(c); }; 当将c传入test函数后,实际返回的结果是char*的长度4,原因是函数参数传入的数组对象都会自动转换成指针
  • 空类的空间是1,多重继承的空类空间也是1,但是虚继承涉及到虚表(虚指针),所以为4

以上所有内容来自《面试宝典》

你可能感兴趣的:(优化,struct,面试,存储,编译器,fun)