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 に答える
2

いいえ、これは C++ では不可能です。標準化するのはかなり難しいでしょう。この場合、セマンティックは単純ですが、構造体が異種の場合はどうなるでしょうか?

于 2013-09-05T12:17:39.737 に答える
0

一般的に、それは悪い考えです。一部の変数を配列として扱いたい場合は、それらを配列として宣言する必要があります:)

それにもかかわらず、コンパイラ固有の命令を使用して、要素間にパディングがないようにすることができます。

#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 に答える