C/C++的sizeof
2022/2/7 17:16:35
本文主要是介绍C/C++的sizeof,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
sizeof的表现,在不同编译器和不同标准下的sizeof的表现是不一样的
C++编译器下的sizeof()(C++14标准)
sizeof()是编译时由编译器计算结果的。
注意:msvc的C++编译器不支持C99的动态数组
C编译器下的C语言
但是在C语言中,
在经典的《C语言程序设计》书中说到:
C语言提供了一个编译时(compile-time) 一元运算符 sizeof,它可以用来计算任一对象的长度。 表达式
sizeof 对象
以及
sizeof(类型名)
将返回一个整型值,它等于指定对象或类型占用的存储空间字节数。
显然,这里得到结论 sizeof 的值是在编译时确定的, 可是在C99标准前这是毫无疑问的,但是C99标准引入了动态数组,比如下列代码:
// 需在C99标准的编译器下编译, ANSI C (即C89)下编译不通过 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int n; scanf("%d",&n); int arr[n]; printf("%d\n",sizeof(n++)); printf("%d\n",sizeof(arr)); printf("%d",n); return 0; }
上述代码开始输入 3 给 n
输出结果为: 4 12 3
即sizeof(n++)中的++未执行,(在sizeof后使用函数,同样在求函数返回值大小时,函数也不会执行)
但sizeof(arr) 一定不是在编译时确定的。 不同的输入得到动态数组大小不一;
所以觉得:
在c99没有出现之前,sizeof是由编译时确定的,
sizeof对一个类型求出的值可以当一个常量来用。 但,c99中引入了动态数组(定义一个数组,其大小由运行时确定) 导致sizeof作用于动态数组时的值不再是常量。
ps: sizeof(‘a’)在C语言中的结果是4,在C++中结果是1,看过某篇文章说C中sizeof侧重于“数”,而C++中sizeof更侧重于“字符”。
两个用宏实现sizeof的经典应用
//适用于非数组 #define _sizeof(T) ((size_t)((T*)0 + 1)) //适用于数组 #define array_sizeof(T) ((size_t)(&T+1)-(size_t)(&T))
对于非数组的宏定义,先是将0转换为T*类型的指针所指向的地址(此时地址为0)。然后对T类型的地址加1,相当于加上了T类型的大小(即得到了非数组T的大小)。前面的size_t只是将地址转化为int型的整数返回。 一个简单的例子:int* p; p=p+1; ——–p是一个int*类型的指针, p+1在地址空间上相当于加上了4个字节。
对于数组的宏定义,类似于非数组的宏定义,为了方便理解,这里可以把数组T看成一个用户自定义的类型,&T表示数组类型的指针,对于数组类型指针加1相当于在地址上加上了该数组大小。由于是用户自定义的类型所以不能强制将0转化为数组类型的地址,只能用加1后的地址减去之前的地址,得到的差值就是数组本身所占的字节大小。
参考链接:
C语言中 sizeof 运算的值是在编译时还是运行时确定?
这篇关于C/C++的sizeof的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-03微信支付提示下单账户与支付账户不一致-icode9专业技术文章分享
- 2024-07-03微信支付提示订单号重复-icode9专业技术文章分享
- 2024-07-02微服务启动nacos注册上去了,但是一直没有收到请求-icode9专业技术文章分享
- 2024-07-02如何检查文件的编码格式-icode9专业技术文章分享
- 2024-07-02sublime 更改编码格式-icode9专业技术文章分享
- 2024-06-30uniAPP 实现全屏左右滚动滚动的效果-icode9专业技术文章分享
- 2024-06-30如何在本地使用授权或插件-icode9专业技术文章分享
- 2024-06-30伪静态规则配置方法汇总-icode9专业技术文章分享
- 2024-06-29易优CMS安装常见问题汇总-icode9专业技术文章分享
- 2024-06-28易优新手必读安装教程-icode9专业技术文章分享