2

私は最近、同僚の1人がこれに似た何かをしているのを見ました。

#include <iostream>

class myClass
{
public:
    float X, Y;
    myClass(int x, int y) : X(x), Y(y){}
};

int main()
{
    char buffer[1024] = { 0 };
    myClass example(12, 24);
    memcpy(buffer, &example.X, sizeof(float) * 2); // Is this safe? Will X always be allocated next o Y?
}

基本的に、彼はメモリコピーにfloatの2倍のサイズを読み取るように指示することにより、Xとの両方Yを1つのステップですべてにコピーしようとしています。char[]

それは間違いなく機能し、通常、これはクールだと思い、先に進みます。しかし、C++では未定義の動作がすべてあるためです。これが常に機能することが保証されているかどうかを知りたいです。Yは常にXの直後に割り当てられますか?

4

1 に答える 1

5

それは間違いなく機能し、通常、これはクールだと思い、先に進みます。しかし、C++ のすべての未定義の動作のためです。これが常に機能することが保証されているかどうかを知りたいです。Y は常に X の直後に割り当てられますか?

絶対にありません。どの構造体でも、メンバー間にパディングを含めることができます。ほとんどのコンパイラには、そのコンパイラを使用して特定のプラットフォームで安全かどうかを示すのに十分なドキュメントがありますが、移植性は決して安全ではありません。の代わりに使用する必要があります。(そして、そもそもなぜあなたがそうしたくないのか、私はちょっと興味があります…)sizeof(myClass)sizeof(float)*2

C++03 を使用している場合、ここに大きな問題myClassがあります。ユーザー定義のコンストラクターがあるため、POD ではないため、まったく移植できませんmemcpy。(最初はこれも C++11 の問題だと思っていましたが、すべてのメンバーが同じアクセス制御を持っているため標準レイアウト クラスです。つまりmemcpy、C++11 でも可能です。)

最後に、これを言うのは少しばかげているように思えるかもしれませんが、1024 バイトが 2 つfloatの struct に十分なスペースであるという保証はありません。あなたは本当に次のようなことをすべきですchar buffer[sizeof(myClass)]

于 2012-11-07T20:29:41.193 に答える