我可以将同一类型的连续数据成员视为范围吗?例如:
struct X
{
int a, b, c, d, e;
};
X x = {42, 13, 97, 11, 31};
std::sort(&x.a, &x.a + 5); // kosher?
答案 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;
};