博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
空结构体与空指针的大小
阅读量:4113 次
发布时间:2019-05-25

本文共 883 字,大约阅读时间需要 2 分钟。

今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码:

#include 
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++编译器会在空类或空结构体中增加一个虚设的字节(有的编译器可能不止一个),以确保不同的对象都具有不同的地址。

转载地址:http://oagsi.baihongyu.com/

你可能感兴趣的文章
认识橄榄油
查看>>
白果的食用方法及其保健功效
查看>>
120个绝对经典的电脑技巧
查看>>
如何通过在 SQL Server 的早期版本使用客户端工具连接到的 SQL Server 2005 或 SQL Server 2000 命名实例
查看>>
煲汤食谱
查看>>
私房小菜菜谱和煲汤大全汇总
查看>>
使用ASP.NET AJAX Control Toolkit中的NoBot控件拒绝垃圾发布程序
查看>>
Ajax Control Toolkit 32个服务器端控件
查看>>
配置ASP.NET AJAX
查看>>
使用 JSON 进行数据传输
查看>>
利用ScriptManager实现Javascript调用WebService中的方法
查看>>
怎样做可以只从某网站搜索信息
查看>>
sql2005管道的另一端上无任何进程”及附带一系列问题完整解决方法
查看>>
ExecuteScalar方法
查看>>
ExecuteReader(),ExecuteNonQuery(),ExecuteScalar
查看>>
ps里jpg格式的图怎么保存成透明的
查看>>
C#中通过使用ADO.NET读写BLOB数据
查看>>
用多活动结果集优化ADO.NET2.0数据连接
查看>>
执行异步操作
查看>>
使用.NET 2.0中的秒表-Stopwatch类进行速度测试
查看>>