我可以将相同类型的连续数据成员视为一个范围吗?例如:
struct X
{
int a, b, c, d, e;
};
X x = {42, 13, 97, 11, 31};
std::sort(&x.a, &x.a + 5); // kosher?
我可以将相同类型的连续数据成员视为一个范围吗?例如:
struct X
{
int a, b, c, d, e;
};
X x = {42, 13, 97, 11, 31};
std::sort(&x.a, &x.a + 5); // kosher?
不,这是未定义的行为。您将其视为x.a
数组的第一个元素,但事实并非如此。可能会在某些实现上起作用,也可能会突袭你的冰箱;)
不要那样做。编译器可以自由地在结构成员之间(以及最后)添加填充。
如果这确实是您想要做的事情,请将其设为数组、向量或类似的。
正如其他人所说,该标准不保证成员的存储没有间隙或其他导致问题的事情。(更糟糕的是,它似乎可以工作,直到你用不同的(版本)编译器编译它,或者几个月或几年后为另一个架构编译它,当然,要弄清楚是什么并不容易出错)。
不,这在 C++ 中是不可能的。标准化会比较困难;在这种情况下,语义很简单,但如果结构是异构的呢?
一般来说,这是一个坏主意。如果要将某些变量视为数组,则应将它们声明为数组:)
不过,您可以使用一些特定于编译器的指令来确保元素之间没有填充,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;
};