面试题:手动实现一个sizeof

面试题:手动实现一个sizeof

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

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

#include <stdio.h>

#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

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值