问题标签 [standard-layout]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
947 浏览

c++ - 联盟成员具有用户定义的构造函数

对于以下代码:

我相信这在 C++ 中是完全合法的。http://en.cppreference.com/w/cpp/language/union#Explanation说:

如果两个联合成员是标准布局类型,则可以在任何编译器上检查它们的公共子序列

因此在 gcc 中我可以这样做

当我在 Visual Studio 2008 中尝试此操作时,出现错误:

错误 C2620: 的成员Bar::fBar具有union Bar用户定义的构造函数或非平凡的默认构造函数

错误 C2620指出:

联合成员不能有默认构造函数。

这里发生了什么?这曾经是 C++ 的要求吗,我认为标准布局是唯一的要求?有解决办法吗?

0 投票
3 回答
10931 浏览

c++ - 工会成员的析构函数是否被调用

C++11 允许在 a 中使用标准布局类型union联合成员具有用户定义的构造函数

union那么我的问题是:当超出范围时,我是否保证将调用自定义析构函数?

我的理解是切换时必须手动销毁和构造:http: //en.cppreference.com/w/cpp/language/union#Explanation

但是像这样的例子呢:

s超出范围时,我是否因为没有调用string析构函数而泄漏了堆上分配的字符串的内存?

0 投票
1 回答
90 浏览

c++ - 为什么具有多个公共访问说明符的类是standard_layout?

我只是在玩 g++,我发现

编译就好了。

根据这个答案,data members across access specifiers may be reordered in memory。因此,没有任何保证实际上必须是实际布置在内存x中的第一个成员。Foo我定义的方式Fooy实际上可能是第一个元素,对吗?

我认为标准布局意味着您可以或多或少地了解给定类型的字节是如何布局的。允许以任意方式重新排序标准布局类型中的字段对我来说似乎违反直觉。为什么允许这样做?

0 投票
0 回答
71 浏览

c++ - c++ - 有没有办法拥有“内联”结构(类似于内联命名空间)

如果我有两个结构:

然后通过一个实例Derived d,我可以直接访问aand bas d.aand d.b

但是,使用此设置,Derived它不是标准布局类型。

如果我想让它成为标准布局,我可以这样做:

但随后要访问a我必须使用d.base.a而不是d.a像以前一样。

我可以像第一个示例一样以Derived一种允许我访问的方式声明该结构ab同时将其保持为标准布局类型吗?

0 投票
2 回答
352 浏览

c++ - “黑盒”类型的标准布局保证的目的是什么?

C++ 标准规定 mutex、atomics 或 conditinal_variable 是标准布局类型。

这个规范有什么好处?用户如何利用此属性?

一般来说,如果知道一个类型是标准布局而不知道它的实现细节,我能得到什么?

0 投票
3 回答
829 浏览

c++ - 读取和比较 POD 类型的填充字节是未定义的行为吗?

今天我遇到了一些大致类似于以下代码段的代码。两者都valgrind检测UndefinedBehaviorSanitizer到未初始化数据的读取。

当一个包含填充p[i] != p[0]字节的对象被传递给foo. 例子:

从 POD 类型读取填充字节并将它们与其他内容进行比较是未定义的行为吗?我在 Standard 和 StackOverflow 上都找不到明确的答案。

0 投票
0 回答
75 浏览

c++ - 进程间通信上下文中具有标准布局的 C++ 类型

该标准指出

标准布局类型对于与用其他编程语言编写的代码进行通信很有用。

但是对于同一台机器上的进程间通信,这仅在使用相同的成员对齐时才成立,例如pramga pack(4)

现在让我们添加其他机器并暂时忽略字节序。pragma pack(16)在这种情况下,发送方和接收方是否允许通过网络发送 POD 而无需任何编组?

为简单起见,我使用更新pragma pack。我知道每个编译器都有自己的符号。所以请不要对此感到厌烦。我也知道它不是标准的一部分。我知道我知道 。. . 只需回答问题或投反对票。但是结束这个问题是荒谬的。

0 投票
0 回答
74 浏览

c++ - 为什么 C++ StandardLayout 不允许混合访问说明符?

我经常听到这是为了与 C 向后兼容。但是 C 没有访问说明符,那么它们怎么会破坏兼容性呢?

还有一个相关的问题,为什么混合访问说明符允许编译器更改内存中结构成员的顺序?

0 投票
0 回答
124 浏览

c++11 - C++11中的POD类型和继承:为什么不能继承和扩展,仍然是POD类型

我认为最好用一个例子来解释:

输出:

为什么不C符合标准布局。正如我所期望的那样,它具有与B. 可能有什么不同?

0 投票
1 回答
481 浏览

c++ - 布局兼容类型的联合

看看这段代码:

是否保证fn()退货1

注意:这是对此的后续问题。