zoukankan      html  css  js  c++  java
  • 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  
    这个类型单个变量的大小:%d  
    这个类型数组变量的大小%d
    ", 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
    %p %p
    ", 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
    ", p, &p+1);
    5     return 0;
    6 }

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

    我们既然知道了对数组来说&T+1相当于一步跨过整个数组,那么这是为什么呢,我由自己的做出相应的猜测,如有错误请在评论区指出。

    对于int p[10];这个数组来说&p和什么相等呢?我测试的结果是&p==p[][10],也就是&p等于一个二维数组的数组名。也就是相当于将p提高了一个维度,原因就是如下的代码:

    #include <stdio.h>
    int main() {
        int p[2][2], T[2];
        printf("%p %p
    %p %p
    ", p, p+1, T, &T+1);
        return 0;
    }

    在运行了代码后你会发现p+1和&T+1的步长都是8。

    那么其实就是对于数组,我们将他本身作为一个变量类型,就是相当于int [10]是一个变量类型。

    再次感受到了那些大佬们的牛逼。

  • 相关阅读:
    微信小程序退款【证书的使用】
    生成随机位数的UUID
    弹出层-layui
    load加载层-layui
    form-layui
    table-layui
    下拉列表模仿placeholder效果
    .net core 2.0 Unable to convert MySQL date/time to System.DateTime
    .net core Include问题
    .net core 2.0 配置Session
  • 原文地址:https://www.cnblogs.com/DCD112358/p/11067113.html
Copyright © 2011-2022 走看看