10

次のコードを想定します。

struct A
{
    int a;
    int b;
};

char* buffer = receivedFromSomeWhere();

A a = *reinterpret_cast<A*>(buffer + 1);

buffer + 0が のサイズでアラインされているint場合、buffer + 1アラインされていないメモリ上にある可能性が最も高くなります。デフォルトのコピー コンストラクターは、2 つの整列されていない int メンバーab. x86/x64 アーキテクチャでは、コードの速度が低下することを除いて、コピーの構築に悪影響を及ぼしaますか?

適切なシリアライゼーションにより、整列されていないメモリの問題が解決されることはわかっています (A構造体が で整列されるように、どこかにパディングを追加することによりbuffer) が、私の場合、この部分については責任を負いません。

4

2 に答える 2

4

C++ と x86_64 アーキテクチャの使用の組み合わせは、アラインされていないアクセスがサポートされることを保証するには不十分です。reinterpret_castアドレスがアラインされていない場合でも、この方法の使用がサポートされていることを特定の C++ 実装から追加で保証する必要があります。特定のコンパイラとターゲット システムを指定すると、これらの操作がサポートされているかどうかを誰かが教えてくれる可能性があります。

このような保証がない場合は、 を使用memcpyして、アラインされていないバッファーから POD (プレーン オールド データ) オブジェクトにバイトをコピーできます。優れたコンパイラは、このようなアクセスを最適化できます。

于 2013-08-08T15:24:47.847 に答える
-1

x86/x64 アーキテクチャでは、アラインされていないアクセスが許可されます。すでに書いたように、これはパフォーマンスに影響を与える可能性があります。しかし、CPU はすべての操作を許可するため、その他の厄介な問題は発生しません。

最新のプロセッサのキャッシュはメモリ サイクルを削減することに注意してください。そのため、アラインされていないアクセスによって発生する SDRAM サイクルはそれほど多くありません。

コピー コンストラクターは問題とはまったく関係ありません。

于 2013-08-08T14:39:09.107 に答える