次のパターンが非常に頻繁に発生しています。
b->last = ngx_cpymem(b->last, "</pre><hr>", sizeof("</pre><hr>") - 1);
リテラル文字列が 2 回使用されていることに注意してください。抜粋は nginx ソースベースからのものです。
コンパイラは、コンパイル単位内でこれらのリテラルが検出されたときに、これらのリテラルをマージできる必要があります。
私の質問は次のとおりです。
- 商用グレードのコンパイラ (VC++、GCC、LLVM/Clang) は、コンパイル ユニット内で発生したときにこの冗長性を取り除きますか?
- (静的) リンカは、オブジェクト ファイルをリンクするときにそのような冗長性を取り除きますか?
- 2 が適用される場合、動的リンク中にこの最適化が行われますか?
- 1 と 2 が当てはまる場合、それらはすべてのリテラルに当てはまりますか。
これらの質問は、プログラマーが効率を失うことなく冗長にできるため、重要です。つまり、プログラムに組み込まれている膨大な静的データ モデル (たとえば、低レベルのシナリオで使用される意思決定支援システムのルール) について考えることができます。 .
編集
2 点 / 説明
上記のコードは、認められた「マスター」プログラマーによって書かれています。男は片手でnginxを書きました。
リテラル ハードコーディングの可能なメカニズムのどれが優れているかは尋ねていません。したがって、話題を逸らさないでください。
編集 2
私の元の例は、非常に不自然で制限的でした。次のスニペットは、内部のハードコーディングされた知識に埋め込まれている文字列リテラルの使用法を示しています。最初のスニペットは、構成パーサーがどの文字列にどの列挙値を設定するかを伝えるためのものであり、2 番目のスニペットは、より一般的にプログラム内の文字列として使用されるためのものです。個人的には、コンパイラが文字列リテラルの 1 つのコピーを使用し、要素が静的であるため、グローバル シンボル テーブルに入らない限り、これで満足しています。
static ngx_conf_bitmask_t ngx_http_gzip_proxied_mask[] = {
{ ngx_string("off"), NGX_HTTP_GZIP_PROXIED_OFF },
{ ngx_string("expired"), NGX_HTTP_GZIP_PROXIED_EXPIRED },
{ ngx_string("no-cache"), NGX_HTTP_GZIP_PROXIED_NO_CACHE },
{ ngx_string("no-store"), NGX_HTTP_GZIP_PROXIED_NO_STORE },
{ ngx_string("private"), NGX_HTTP_GZIP_PROXIED_PRIVATE },
{ ngx_string("no_last_modified"), NGX_HTTP_GZIP_PROXIED_NO_LM },
{ ngx_string("no_etag"), NGX_HTTP_GZIP_PROXIED_NO_ETAG },
{ ngx_string("auth"), NGX_HTTP_GZIP_PROXIED_AUTH },
{ ngx_string("any"), NGX_HTTP_GZIP_PROXIED_ANY },
{ ngx_null_string, 0 }
};
密接に続く:
static ngx_str_t ngx_http_gzip_no_cache = ngx_string("no-cache");
static ngx_str_t ngx_http_gzip_no_store = ngx_string("no-store");
static ngx_str_t ngx_http_gzip_private = ngx_string("private");
話題にとどまった人たち、ブラボー!