• 面试题:手动实现一个sizeof


    面试题:手动实现一个sizeof

    前几天在网上看到这样一个面试题,好像是腾讯的。

    就是手动实现一个sizeof操作符,实际上面试官想要的考点应该是通过偏移量来实现检测sizeof的功能。即使明白这个考点,如果没有准备的话实现起来也是不是特别容易的。简单概括就是定义一个结构体,将要计算的类型放入结构体中,通过结构体指针的偏移量来确定。

    #include 
    
    #define my_sizeof(type) ((size_t)(&((struct {char c; type t; }*)0)->t))
    
    int main() {
        printf("Size of char: %zu\n", my_sizeof(char));
        printf("Size of int: %zu\n", my_sizeof(int));
        printf("Size of double: %zu\n", my_sizeof(double));
    
        // 对于数组,我们直接计算类型的大小再乘以元素数量
        printf("Size of int[10]: %zu\n", my_sizeof(int) * 10);
    
        return 0;
    }
    

    让我们来具体解释一下:

    1. 定义匿名结构体:
      • struct {char c; type t; } 定义了一个匿名结构体,它包含两个成员:一个 char 类型的成员 c 和一个 type 类型的成员 t
    2. 将空指针转换为结构体指针:
      • (struct {char c; type t; }*)0 将空指针 0 转换为指向该匿名结构体的指针,因为我们需要通过指针访问成员来得到偏移量。
    3. 访问结构体成员 t 的地址:
      • ((struct {char c; type t; }*)0)->t 通过指针访问结构体成员 t 的地址。
      • 由于 cchar 类型,占用1字节,所以 t 的地址实际上是 type 类型在结构体中的偏移量。因为内存对齐的原则,c的类型需要是最小的,这样不管type是什么类型,c占用的内存大小与type类型相同,因而偏移量就是type类型的大小。
    4. 计算偏移量:
      • &((struct {char c; type t; }*)0)->t 获取成员 t 的地址偏移量,这个偏移量就是 type 类型的大小。
      • 由于 c 的大小固定为1字节,所以 t 的地址就是 type 的大小。
    5. 转换为 size_t 类型:
      • 最后将偏移量转换为 size_t 类型,即 ((size_t)(&((struct {char c; type t; }*)0)->t))

    不过,需要注意的是,这种方法是纯粹依靠编译器和平台的内存布局来确定的,对于某些复杂类型如结构体和联合体等,这种方法可能并不适应。但仅仅作为面试的一个考点应该是够, 想要面试的时候不仅能够快速想到这个考点而且能够短时间内手动实现代码,平时要多看、多思考并且多写。

    最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

  • 相关阅读:
    年初离职,学习半年源码,终于拿到了蚂蚁Offer,分享面试过程
    方舟生存进化服务器怎么开?方舟生存进化架设服务器教程
    c++ logic_error() 异常的使用方法
    【Ubuntu】树莓派4B安装Ubuntu18.04(超详细)
    Java编程练习题:Demo96 - Demo105(多维数组)
    深度学习之基于Python+OpenCV(DNN)性别和年龄识别系统
    基于JAVA疫情物质管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    生成对抗性网络简介
    部署MES系统的实际作用和意义是什么?这篇文章总结得很全面
    Python 代码学习
  • 原文地址:https://blog.csdn.net/Faya__/article/details/139288788