をfloatへの定数ポインタである、そのための明示的なサポートが標準でありませんそれに非常に近いもののサポートが推測できます。
は自明コピー可能タイプ
T
を考えると、どのような明示的に許可されていますと、
char
(または
unsigned char
)と背面の配列にその表現をコピーすることです。
配列の内容が配列自体に保存されている必要はありません。内容はファイルに保存され、プログラムのその後の実行時に再読み込みされる可能性があります。または、そのタイプが許す限り、異なるタイプのオブジェクトに格納されます。これを実行するには、同じ実行でタイプT
のオブジェクトからそれらの表現が始まっていない場合、実装はmemcpy
のオブジェクトへの表現を許可する必要があります。
その結果、非常に少なくとも、
int main() {
vec v = {1.9f, 2.5f, 3.1f};
float a[3];
assert(sizeof v == sizeof a);
{ char tmp[3 * sizeof(float)];
std::memcpy(tmp, &v, 3 * sizeof(float));
std::memcpy(a, tmp, 3 * sizeof(float)); }
assert(a[0] == v.x);
assert(a[1] == v.y);
assert(a[2] == v.z);
vec u;
{ char tmp[3 * sizeof(float)];
std::memcpy(tmp, a, 3 * sizeof(float));
std::memcpy(&u, tmp, 3 * sizeof(float)); }
assert(u.x == a[0]);
assert(u.y == a[1]);
assert(u.z == a[2]);
}
最初assert
で失敗、または渡す必要のいずれか。それが失敗する表現については、その正確な表現があいまいではない方法で出現する関数を作成することは自明であるため、失敗してはならない。
ここで、tmp
を省略すると、ちょっとしたことがあります。
std::memcpy
は、個々のバイトの割り当てを繰り返すだけであり、明示的にスペルアウトされている可能性があります。 =
演算子のセマンティクスは、簡単にコピー可能なタイプの場合、a = b;
と{ auto tmp = b; a = tmp; }
が同等であることを意味します。 a = b; c = d;
および{ auto tmp1 = b; auto tmp2 = d; a = tmp1; c = tmp2; }
などと同じです。前者は直接memcpy
のものですが、後者は2つでmemcpy
からtmp
までです。
一方、char
の配列のコピーおよびコピーアウトの許可は、機能的に同等ではなく、実際の配列char
を必要とするものとして読み取ることができます。
個人的には、私が実際にその解釈を使用する実装を見つけない限り、おそらく心配しないでしょうが、安全にプレイしたい場合は、そのような一時的な配列を導入して、それは離れている。
出典
2017-02-04 10:27:28
hvd
関連(または重複):http://stackoverflow.com/questions/37211298/accessing-an-array-as-a-struct-vs-undefined-behavior – Barmar
@Barmarこれは、私はリンクされた質問。 –
彼らはどちらも未定義の動作だと言っています。なぜあなたのケースは違うと思いますか? – Barmar