数据成员是否形成范围?

时间:2013-09-05 12:11:08

标签: c++ c++11 stl iterator object-layout

我可以将同一类型的连续数据成员视为范围吗?例如:

struct X
{
    int a, b, c, d, e;
};

X x = {42, 13, 97, 11, 31};

std::sort(&x.a, &x.a + 5);   // kosher?

5 个答案:

答案 0 :(得分:15)

不,这是未定义的行为。您正在将x.a视为数组的第一个元素,而不是数组的第一个元素。可能会在一些实现上工作,也可能袭击你的冰箱;)

答案 1 :(得分:7)

不要那样做。编译器可以在结构成员之间(以及最后)添加填充。

答案 2 :(得分:4)

如果您真的想做这件事,请将其设为数组,矢量或类似内容。

正如其他人所说,该标准不保证成员的存储没有间隙或其他导致问题的事情。 (更糟糕的是,它似乎可行,直到用不同的(版本)编译器编译它,或者在几个月或几年之后用于其他架构,当然,要弄清楚是什么并不容易出错)。

答案 3 :(得分:2)

不,这在C ++中是不可能的。标准化相当困难;在这种情况下,语义很简单,但如果结构是异构的呢?

答案 4 :(得分:0)

一般来说,这是一个坏主意。如果要将某些变量视为数组,则应将它们声明为数组:)

尽管如此,您可以使用一些编译器特定的指令来确保元素之间没有填充,f.i。:

#pragma pack(push, 1)  
struct X
{
    int a, b, c, d, e;
};
#pragma pack(pop)

struct  __attribute__((__packed__)) X
{
    int a, b, c, d, e;
};