空结构体与空指针的大小
来源:互联网 发布:西马智能马桶好吗 知乎 编辑:程序博客网 时间:2024/05/20 04:12
今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码:
#include <iostream>struct S0{ };int main(){ std::cout << sizeof S0 << std::endl; return 0;}
面试官当场提醒了我一下,说如果S0对象所占用的内存大小为0,那么将可以申请无限多个此类型的对象数组,并且大小永远为0。我当时觉得有点道理,不过转念一想,还是有点疑惑。
回来研究了一下,原来在C++语言中的确规定了空结构体和空类所占内存大小为1,而C语言中空类和空结构体占用的大小是0(在gcc中测试为0,其他编译器不一定)。由此又产生了一个新的疑问:为什么C++会有这样的规定呢?
原来,C++语言标准中规定了这样一个原则:“no object shall have the same address in memory as any other variable”,即任何不同的对象不能拥有相同的内存地址。如果空类对象大小为0,那么此类数组中的各个对象的地址将会一致,明显违反了此原则。
进一步地,C++做出这样规定的原因究竟有什么道理呢?请看下面这个计算元素个数的例子:
T array[5];int count = &array[4] - &array[0];
这种指针相减的运算在编译器中会等价于如下步骤:
count = ((char *)&array[4] - (char *)&array[0]) / sizeof T;
如果允许C++对象大小为0,那么这里的运算将产生两个问题:(1)不能通过指针区分不同的数组对象;(2)sizeof T为0导致非法的除0操作。这样一来,编译器还需要用一些复杂的代码来处理这些异常情况信息。
为了满足C++标准规定的不同对象不能有相同地址,C++编译器保证任何类型对象大小不能为0。C++编译器会在空类或空结构体中增加一个虚设的字节(有的编译器可能不止一个),以确保不同的对象都具有不同的地址。
阅读全文
0 0
- 空结构体与空指针的大小
- 空类与空结构的大小
- 空类与空结构的大小
- 空类与空结构体大小
- 题目:空结构体和空类的大小
- 空类和空结构体的大小
- 空结构体(类)的大小
- 结构体中的空指针
- 【程序设计】C与C++中空结构体与空类的大小
- C语言_空结构体的大小
- C++中空类和空结构体大小的问题?
- 空结构体sizeof()获取的大小是多少
- 空指针与空字符串
- 空指针与void指针的区别
- 结构体指针和结构体对象的创建、置空、赋值以及与string的转换
- C++ 中“空引用”与“空指针”的区别
- C++ 中“空引用”与“空指针”的区别
- null与空串的区别,什么是空指针,如何解决空指针异常
- ionic项目 js查找文件并且转换成base64
- 学习jquery源代码---$.extend
- 抽象工厂模式
- Java 集合类详情
- AtCoder Grand Contest 017-A
- 空结构体与空指针的大小
- Python爬虫实践笔记(一)
- DevExPress控件 客户端常用方法
- Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型
- servlet过滤器—filter
- swift3.0 协议
- Pivoting “long” to “wide” Format 将“长格式”旋转为“宽格式” 书中开头缺失的 ldata 变量之实现代码
- 【LeetCode】485 Max Consecutive Ones
- JVM类加载机制