同じ型の連続するデータ メンバーを範囲として扱うことはできますか? 例えば:
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++ では不可能です。標準化するのはかなり難しいでしょう。この場合、セマンティックは単純ですが、構造体が異種の場合はどうなるでしょうか?
一般的に、それは悪い考えです。一部の変数を配列として扱いたい場合は、それらを配列として宣言する必要があります:)
それにもかかわらず、コンパイラ固有の命令を使用して、要素間にパディングがないようにすることができます。
#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;
};