gpt4 book ai didi

C++ + gcc : tail padding reuse and PODs

转载 作者:行者123 更新时间:2023-12-01 14:47:57 26 4
gpt4 key购买 nike

相关问题:Standard-layout and tail padding

片段:

#include <iostream>
#include <type_traits>

struct A0
{
int a;
char c;
};

struct B0 : A0
{ char d; };

struct A1
{
int a;

private:
char c;
};

struct B1 : A1
{ char d; };

struct A2
{
private:
int a;
char c;
};

struct B2 : A2
{ char d; };

int main()
{
std::cout << std::is_pod<A0>::value << ' ' << sizeof(B0) << std::endl; // 1 12
std::cout << std::is_pod<A1>::value << ' ' << sizeof(B1) << std::endl; // 0 8
std::cout << std::is_pod<A2>::value << ' ' << sizeof(B2) << std::endl; // 1 8
}

Live demo//使用 g++

通常说,当您从带有尾部填充的 POD 类型继承时,由于某些历史原因,Itanium ABI(老实说,我不知道那是什么)不允许重用基类的尾部填充子对象,如果这样的子对象是 POD。

但是,在第三种情况下, A2是 POD,因为它的所有成员都有相同的访问控制,但是 B2正在重用这样的尾部填充。这是为什么?

最佳答案

当前标准始终允许在任何基类子对象中重复使用对齐尾孔。它不必是“POD”(或现代的等价物,“可简单复制”)。实际上,任何基类子对象都是“可能重叠的子对象”,而“可能重叠的子对象”不是memcpy -有能力的。

Itanium ABI 不跟踪当前标准中什么是或不是 POD 或等效项。它允许(实际上是强制)对齐尾孔在根据 C++98 定义不是 POD 的任何基础子对象中重用。

1.1 Definitions :

This ABI uses the definition of POD only to decide whether to allocate objects in the tail-padding of a base-class subobject. While the standards have broadened the definition of POD over time, they have also forbidden the programmer from directly reading or writing the underlying bytes of a base-class subobject with, say, memcpy. Therefore, even in the most conservative interpretation, implementations may freely allocate objects in the tail padding of any class which would not have been POD in C++98. This ABI is in compliance with that.



在 C++98 中, A2不会是 POD,因为它有私有(private)成员。因此 GCC 根据 ABI 重用尾部填充,并符合当前标准或任何以前的 C++98 标准。

关于C++ + gcc : tail padding reuse and PODs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61548135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com