3

Chromiumソースからの次のコードスニペットが私の目に留まりました(ここの155行目を参照):

std::string PrintPreviewUI::GetPrintPreviewUIAddress() const {
  // Store the PrintPreviewUIAddress as a string.
  // "0x" + deadc0de + '\0' = 2 + 2 * sizeof(this) + 1;
  char preview_ui_addr[2 + (2 * sizeof(this)) + 1];
  base::snprintf(preview_ui_addr, sizeof(preview_ui_addr), "%p", this);
  return preview_ui_addr;
}

2 + (2 * sizeof(this)) + 1評価しません3 + 2 * sizeof(this)か?なぜ作者はこのように表現を書くことを選んだのですか?

4

4 に答える 4

11

はい、同じように評価します。

おそらく、著者は、配列がどのようにレイアウトされているかを明確にするために、そのように書いています。つまり、1つのものに2バイト、次に2つのポインター、さらに1バイトが含まれているということです。(実際には、ポインターの文字列表現の長さがポインターのメモリー内の幅と同じではないため、この場合にsizeof()演算子を使用することを選択した理由はわかりません)

コンパイラはコンパイル時に計算を最適化するため、パフォーマンスは影響を受けません。他のプログラマーが3がどこから来たのかを理解する必要がないようにするためだけです。

于 2012-08-22T20:42:27.877 に答える
2

はい、同じです。この場合のように、すべての型が整数であり、浮動小数点ではないと仮定します(浮動小数点の場合、結果は通常同じですが、次のような奇妙なエッジケースがいくつかあります。あなたを驚かせることができる丸みを帯びています)。

著者はおそらく明確にするためにそのように書くことを選択しました:彼らは2バイトを取り、さらにデータを追加し、次にもう1バイトを追加することによって構築されるバッファに特定の文字列を格納しています。このように記述することで、コードリーダーは、計算されたサイズが、一度に1つずつ照合することで、書き込まれるデータの量と実際に一致することを簡単に再確認できます。

于 2012-08-22T20:43:26.217 に答える
2

おそらく読みやすさのために。それを書いた人は誰でも、2と1は、3つだけで、何が構成されているのかわからないのではなく、2つの異なる情報であることを表現しようとしています。

于 2012-08-22T20:43:38.343 に答える
0

これは、コンパイルプロセスの変換段階で生成されるアセンブリコードに違いはありません。

著者がこのようにコードを書くために私が考えることができる唯一の本当の理由は、読みやすさの理由かもしれません-おそらく、著者がコードにこのロジックを実装する前に「代数的単純化」を使用した場合よりも、ロジックはこの方法でより明確です。

投稿のタイトルに関する純粋に数学的なメモでは、はい2 + x+1は確かにx+3に等しいです。ただし、コンピュータープログラミングとは異なり、数学(少なくとも算術/代数)でxと言うことは決して有効ではありません。 = x + 1 :-)

于 2012-08-22T20:47:27.110 に答える