c++ sizeof()详解

sizeof()

实现方法:主要是计算与地址0的偏移量。

#define sizeof(type) ((size_t) ((type*)0 + 1))

sizeof 是一个关键字,同时也是一个运算符,它是一个编译时运算符,用于判断变量或数据类型的字节大小。
sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
  2. 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
  3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)
  4. union sizeof计算规则:sizeof(union)=最宽基本成员变量的字节数
  5. sizeof(string)大小不一定,有可能为4,40。string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。
  6. sizeof(指针) 一般为在32位机上为4,在64位机上为8。

常见形式

intshortfloatdoubleboolchar
428811

测试

    #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;
 };


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值