当前位置: 首页 > 知识库问答 >
问题:

POD struct(相同类型的成员):成员是否在连续的内存位置?

堵昊焱
2023-03-14

考虑到

template <typename T>
struct Vector3d { T x, y, z; };

>

  • 假设x、y和z位于连续的内存位置安全吗?

    假设for T = float和< code>T = double至少是安全的吗?

    如果没有,是否有可能以跨平台的方式执行?

    注意:我不介意在z后面填充,只要x,y,z是相邻的

  • 共有3个答案

    虞高雅
    2023-03-14

    不,绝对不能保证相同类型的结构元素之间没有填充,即使对于“大型”普通旧数据类型,例如double,也是如此。此外,在指向另一个元素的指针上尝试通过指针算法到达元素的行为是未定义的。

    写起来好多了

    template <typename T>
    struct Vector3d { T t[3]; };
    

    其中保证了连续性和指针算术,并为xyz提供访问函数。

    如果您不喜欢调用函数的语法,并且愿意承受结构本身中最可能出现的一些开销,那么您可以始终绑定引用:

    template <typename T>
    struct Vector3d
    {
        T t[3];
        T& x = t[0];
        T& y = t[1];
        T& z = t[2];
    };
    
    元彦君
    2023-03-14

    假设xyy和

    标准没有做出这样的保证。

    但是在实践中,一个合理的实现不会在相同类型的相邻字段之间插入任何填充(因为这样的填充是不必要的)。

    如果您想要额外的安全性,请添加一个static_assert

    static_assert(sizeof(Vector3d<float>) == 3 * sizeof(float));
    

    假设for T = float和< code>T = double至少是安全的吗?

    据我所知,字段类型在这里没有任何区别。

    1 — 数组保证不包含填充。由于您可以创建任何类型的数组,因此实现必须能够将任何单个类型的对象彼此相邻地存储,并且没有填充。

    倪灿
    2023-03-14

    假设x、y和z位于连续的内存位置安全吗?

    从技术上来说,语言没有这样的保证。

    另一方面,它们也没有必要不相邻,实际上它们很可能是相邻的。

    如果没有,是否有可能以跨平台的方式执行?

    将保证位于连续内存位置中的对象的跨平台方式是数组:

    template <typename T>
    struct Vector3d { T components[3]; };
    

    数组还允许使用指针算法迭代对象。

     类似资料:
    • 是否可以编写一个模板,根据是否在类上定义了某个成员函数来改变行为? 下面是我想写的一个简单的例子: 因此,如果定义了,那么它将使用它;否则就不会。我不知道怎么做的神奇部分是“function_exists”部分。

    • 问题内容: 我经常要检查一个对象是否有成员。一个示例是在函数中创建单例。为此,可以这样使用: 但您也可以这样做: 一种方法比另一种更好吗? 编辑: 添加了…但是,请注意,问题 不 在于如何制作单例,而在于如何检查对象中成员的存在。 编辑: 对于该示例,一种典型用法是: 然后是类型相同的对象,每次相同。并且,通常,该方法被调用多次。 问题答案: 这是两种不同的方法:№1是LBYL(飞跃前先看一下),

    • 问题内容: 我正在一个Swift操场上玩,正在上一堂新课。由于某种原因,我不断收到这样的错误:类“没有成员类型”,其名称的常量前面定义了三行。这是代码: Xcode Beta6一直在倒数第二行给我一个错误,说“ DataModel.Type没有名为’myCalendar’的成员 尽管我认为这不会有所作为,但我尝试将myCalendar定义为var。 问题答案: 您无法初始化引用同一类的另一个实例属

    • 我在玩 和类型< code>Z 显然,< code>Z的大小必须至少为< code>2,因为< code>e1和< code>e2的类型相同。 但是,我真的希望< code>Z的大小为< code>1。这让我想到,如何用额外的模板参数将< code>Empty包装在某个包装类中,以强制执行不同类型的< code>e1和< code>e2。 不幸的是,。有没有一个技巧可以使的大小成为一个? 我正在使

    • 主要内容:在类体中和类体外定义成员函数的区别类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是

    • 在C++98标准里,只有static const声明的整型成员能在类内部初始化,并且初始化值必须是常量表达式。这些限制确保了初始化操作可以在编译时期进行。例如: int var = 7; class X { static const int m1 = 7; // 正确 const int m2 = 7; // 错误:无static static int m3 =