sizeof()
实现方法:主要是计算与地址0的偏移量。
#define sizeof(type) ((size_t) ((type*)0 + 1))
sizeof 是一个关键字,同时也是一个运算符,它是一个编译时运算符,用于判断变量或数据类型的字节大小。
sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。
- 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
- 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
- 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)
- union sizeof计算规则:sizeof(union)=最宽基本成员变量的字节数
- sizeof(string)大小不一定,有可能为4,40。string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。
- sizeof(指针) 一般为在32位机上为4,在64位机上为8。
常见形式
int | short | float | double | bool | char |
---|---|---|---|---|---|
4 | 2 | 8 | 8 | 1 | 1 |
测试
#include <iostream>
#include <cstdlib>
#include<string>
#include<cstdio>
using namespace std ;
struct st{
char a; //size=1 + 对界偏移为7
double b; //size=8
int c; //size=4
char d; //size=1+对界偏移为3
}; //最后输出为1+7+8+4+1+3=24
union uu{
int i;
char c;
};//最后输出为4,因为最大字节为int的4字节
void test(){
bool bl=true;
int a=10;
int arr[10]={1,2,3};
char str[]="hello";
int *p =NULL;
string s ="dsaafgwegrtbrbrtgrtbrbrtbrtbrtbrtbrtbrtbrtbrtbrbtrtbrtbdfvdfdbdfb";
int len_a = sizeof(a);
int len_arr = sizeof(arr);
int len_str = sizeof(str);
int len_p=sizeof(p);
int len_s = sizeof(s);
printf("len_st=%d\n",sizeof(st));
printf("len_uu=%d\n",sizeof(uu)) ;
printf("len_bl=%d\n",sizeof(bl)) ;
printf("len_a=%d\nlen_arr=%d\nlen_str=%d\nlen_p=%d\nlen_s=%d\n",len_a,len_arr,len_str,len_p,len_s);
}
int main(){
test();
return 0;
}
其他易错点
cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl;输出为1
int a = 0;
cout<<sizeof(a=3)<<endl;//输出为4,注意这里不能完成a=3的赋值
cout<<a<<endl;//输出为0
class A{
public:
int a;//4
char b;//1+3
};
class B:public A{ //sizeof(B)=1+3+4+1+3=12
public:
char c;
};