0

intをboost/std :: arrayにコピーする最も簡単で効率的な理由は何ですか?

以下はうまくいくようですが、これがそれを行うための最も適切な方法であるかどうかはわかりません。

  int r = rand();
  boost::array<char, sizeof(int)> send_buf;
  std::copy(reinterpret_cast<char*>(&r), reinterpret_cast<char*>(&r + sizeof(int)), &send_buf[0]);
4

4 に答える 4

4

比較のために、memcpyでも同じことが言えます。

#include <cstring>

int r = rand();
boost::array<char, sizeof(int)> send_buf;
std::memcpy(&send_buf[0], &r, sizeof(int));

キャストの爆発的増加(およびそれらを誤解する機会)が、Cにも存在する関数を使用するC++の「罪」よりも良いか悪いかというあなたの呼びかけ;-)

個人的には、C ++スタイルのキャストが優れた「アラーム」であるのと同じ理由で、この種の操作には非常に優れた「アラーム」だと思いますmemcpy(読みながら見つけやすく、検索しやすい)。ただし、すべてに同じアラームを設定することをお勧めします。その場合は、の引数をmemcpyにキャストできますvoid*

ところで、私はsizeof rではなく両方のサイズに使用するかもしれませんがsizeof(int)、コンテキストが配列が「r(たまたまint)に対して十分な大きさ」であるか「intと同じサイズ(rたまたま)」。rこれは送信バッファであるため、バッファはワイヤプロトコルが要求するサイズであり、その逆ではなく、バッファと一致することになっていると思います。したがってsizeof(int)、おそらく適切ですが4PROTOCOL_INTEGER_SIZEそれでもなお適切である可能性があります。

于 2012-09-18T09:39:41.117 に答える
3

アイデアは正しいですが、バグがあります。

reinterpret_cast<char*>(&r + sizeof(int))

する必要があります:

reinterpret_cast<char*>(&r) + sizeof(int)

また

reinterpret_cast<char*>(&r+1)

これらまたはmemcpy同等のものはOKです。それ以外のものは、アライメントの問題のリスクがあります。

于 2012-09-18T07:57:58.720 に答える
2

reinterpret_castこれらの目的で使用するのは一般的な通貨ですが、標準では、 static_castviavoid*が完全に受け入れられることを明確にしています。実際、intthenのような型の場合、のセマンティクスを持つようreinterpret_cast<char*>(&r)定義さstatic_cast<char*>(static_cast<void*>(&r))れます。明示して、それを完全に使用してみませんか?

習慣に入ると、将来、常に明確に定義されたセマンティクスを持つチェーンではreinterpret_castなく、実装によって定義されたセマンティクスを持つことになるaを使用する可能性が低くなります。static_cast

単一のオブジェクトへのポインタを、1つの配列へのポインタであるかのように扱うことができることに注意してください(5.7 / 4を参照)。これは、2番目のポインタを取得するのに便利です。

int r = rand();
boost::array<char, sizeof(int)> send_buf;
auto cast = [](int* p) { return static_cast<char*>(static_cast<void*>(p)); };
std::copy(cast(&r), cast(&r + 1), &send_buf[0]);
于 2012-09-18T09:10:17.557 に答える
0

MichaelAndersonが指摘したマイナーバグ

しかし、あなたはこれを行うことができます:

#include <iostream>

union U
{
    int  intVal;
    char charVal[sizeof(int)];
};

int main()
{
    U   val;
    val.intVal  = 6;

    std::cout <<  (int)val.charVal[0] << ":" << (int)val.charVal[1] << ":" << (int)val.charVal[2] << ":" << (int)val.charVal[3] << "\n";
}
于 2012-09-18T07:59:55.537 に答える