一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
When can an object have either but not both of non zero size , one or more bytes of storage?
C++ 14 个介绍.cpp 状态:
a most derived object shall have a non-zero size and shall occupy one or more bytes of storage
他们为什么要声明
非零大小
和
一个或多个字节的存储空间
什么时候可以有一个而不能有另一个?
这两个部分实际上是在说不同的事情。
大多数派生对象应具有非零大小
这意味着使用对象sizeof
将返回非零大小。
一个最派生的对象...应占用一个或多个字节的存储空间
这意味着对象占用一些字节(一个或多个)内存。
如果第二个语句不存在,那么这可能意味着sizeof
将报告非零大小,但对象实际上可能没有使用任何内存。
如果没有第一个语句,这可能意味着sizeof
可以返回零,但对象仍将占用内存中的空间。
两者都是必需的,并且彼此正交。
在某些情况下,一个类可能具有非零大小(由sizeof
返回),但它实际上并不占用内存上的任何空间。例如,空基优化 (EBO)用于使派生对象的基本部分不占用内存空间,如下例所示:
#include <stdio.h>
struct Base {};
struct Derived : Base
{
int a;
};
int main()
{
printf("sizeof(Base) = %dn", sizeof(Base));
Derived* p = new Derived;
void* p1 = p;
void* p2 = &p->a;
if(p1 == p2) { printf("Good compilern"); }
return 0;
}
在 Ubuntu 14.04 x64 上使用 gcc 4.8.4 编译。
输出:
sizeof(Base) = 1
Good compiler
相关文章:
- 是否可以将函数导入命名空间,但不能导出它?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- C++:返回本地对象,但不能正常工作
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 用C++替换std::字符串中的一个子字符串,但不能全部替换
- 我可以在Windows(Visual C++)中读取bin文件,但不能在linux(GCC)上读取bin文件
- QProcess可以启动程序,但不能启动python(命令行)
- 一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
- 我的C++ Unity 插件在编辑器中运行一次,但不能运行两次
- 编译后的python库可以在一台计算机上运行,但不能在另一台计算机上运行