sizeof是C语言的一个运算符,对,简简单单就只是一个运算符,不是什么宏,不是什么函数,就像你经常见到的加减乘除符号一样,低调得不能再低调的这么一个运算符。所以好心劝你别去找sizeof的源码啦😂(比如我:C语言sizeof源码实现、sizeof实现机制、内核sizeof实现。。。)
或许你一样好奇,对于一个整形数,可以获取到它为4字节,不足为怪,但是对于一个数组,也就是内存,它是怎么知道要读多长呢?字符串还好,有结束标志符,但是数组没有啊。注意,sizeof在预处理阶段并没有展开,我认为是与编译器的某些内部操作有关,因为不管你怎么搞,编译器对你是最清楚的,你用了任意一块内存都被编译器记录在案,所以还是有在gcc编译里有哪些操作我们看不到的,所以还是别去想sizeof到底怎么实现的啦。
写代码的人应该想着自己来实现这么一个功能,即使用宏的方式实现一个与sizeof差不多的效果,这里只涉及sizeof简单的用法,比如sizeof(int),sizeof(3),别整那些sizeof(1+2)或者sizeof int什么的😅
网传较多的有两种方法:
//针对T为一个类型名的情况
#define _sizeof_type(T) (size_t)((T*)0 + 1)
//针对T为一个变量或者数组名的情况
#define _sizeof(T) ((size_t)(&T + 1) - (size_t)(&T))
利用0地址来计算差值,好处多

本文探讨了C语言中sizeof运算符的工作原理,并通过宏展示了如何实现类似功能。介绍了利用0地址计算的方法,解释了指针加1后计算地址偏移以确定类型大小的原理。还提到了对不同类型名和变量名的处理方法,并给出了一些实现示例。
最低0.47元/天 解锁文章
9097

被折叠的 条评论
为什么被折叠?



