16

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

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

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

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

5 回答 5

15

不,这是未定义的行为。您将其视为x.a数组的第一个元素,但事实并非如此。可能会在某些实现上起作用,也可能会突袭你的冰箱;)

于 2013-09-05T12:17:15.077 回答
7

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

于 2013-09-05T12:23:20.373 回答
4

如果这确实是您想要做的事情,请将其设为数组、向量或类似的。

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

于 2013-09-05T12:52:56.220 回答
2

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

于 2013-09-05T12:17:39.737 回答
0

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

不过,您可以使用一些特定于编译器的指令来确保元素之间没有填充,fi:

#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;
};
于 2013-09-07T21:21:11.210 回答