c++ sizeof的实现

释放双眼,带上耳机,听听看~!

在c++中有一种运算符叫sizeof,这个运算其实可以依靠两句宏定义来实现;

 1 #include <stdio.h>
 2 
 3 #define sizeof_T(T) ((size_t)((T*)0+1))             ///求类型的大小
 4 #define sizeof_V(T) ((size_t)(&T+1)-(size_t)(&T))   ///求变量的大小
 5 
 6 int main() {
 7     int a=1, b[3]={0};
 8     printf(\"这个类型大小:%d  \\n这个类型单个变量的大小:%d  \\n这个类型数组变量的大小%d\\n\", sizeof_T(int), sizeof_V(a), sizeof_V(b));
 9     return 0;
10 }

那么为什么可以这样实现呢?

对于求类型大小的sizeof_T:

首先我们通过(T*)0得到一个指向00000000的指针,而且这个指针是int类型的,现在我们将这个指针+1。比如我们用一个int *p指针指向一块new int[10]的地址,那么此时很显然(p+1)-p==4而不是1,因为我们其实不是在地址上加1,而是让指针向前前进了一步,而这一步就是T这个类型的大小,也就是我们求的其实是指针步长。

可以通过以下程序发现这个特点,然后我们将00000000位置的指针向前移动一步,很显然,这个时候我们就得到了这个类型的大小。

 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 int main() {
 5     char *p=new char[10];
 6     int *q=new int[10];
 7     printf(\"%p %p\\n%p %p\\n\", p, p+1, q, q+1);
 8     delete p;
 9     delete q;
10     return 0;
11 }

对于求变量大小的sizeof_V:

也是利用了指针步长的原理,这里值得注意的有两点.

一是因为这里我们不是类型,所以说不可能定义一个指向0的指针,只能将自己的地址拿来运算。

二是数组名有一个特性,对于int p[10];这个数组,&p+1的值并不是数组首地址加上指针步长,此时的步长是数组本身,也就是一步跨越了整个数组。

第二点可以通过以下程序来验证

1 #include <stdio.h>
2 int main() {
3     int p[3];
4     printf(\"%p %p\\n\", p, &p+1);
5     return 0;
6 }

 

所以由以上特性我们就可以手动实现sizeof的功能了,说白了就是求指针步长。

 

给TA打赏
共{{data.count}}人
人已打赏
随笔日记

MySQL数据库详解(二)一条SQL更新语句是如何执行的?

2020-11-9 5:29:53

随笔日记

(6/21)名博看后市:A股格局出现重大变化 下周迎来中线转折点

2020-11-9 5:29:55

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索