[解決済み] なぜ一部のコンパイラは同一の文字列リテラルに同一のアドレスを使用するのですか?
2023-02-12 14:21:55
疑問点
私は、2つの
'some'
リテラルが見えますが、clangとgccでは1つだけです。これは、コード実行の結果がまったく異なることにつながります。
static const char *A = "some";
static const char *B = "some";
void f() {
if (A == B) {
throw "Hello, string merging!";
}
}
これらのコンパイル出力の違いと類似点を説明できる人はいますか?なぜ clang/gcc は最適化が要求されていないにもかかわらず、何かを最適化するのでしょうか? これはある種の未定義の動作なのでしょうか?
私はまた、宣言を以下に示すものに変更した場合、clang/gcc/msvcは何も残さないことに気づきました。
"some"
を全く残しません。なぜ動作が違うのでしょうか?
static const char A[] = "some";
static const char B[] = "some";
どのように解決するのですか?
これは未定義の動作ではなく、未指定の動作です。例えば 文字列リテラル ,
コンパイラは、等しいまたは重複する文字列リテラルに対してストレージを結合することができますが、必須ではありません。つまり、同一の文字列リテラルは、ポインターで比較されたときに等しく比較されるかもしれないし、されないかもしれません。
の結果を意味します。
A == B
は
true
または
false
に依存してはいけません。
規格から [lex.文字列]/16 :
<ブロッククオートすべての文字列リテラルが区別できるかどうか(つまり、重ならないオブジェクトに格納されるかどうか)、文字列リテラルの連続した評価が同じオブジェクトをもたらすか異なるオブジェクトをもたらすかは、特定されません。
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 未定義、未指定、および実装で定義された動作
-
[解決済み】文字列リテラルで初期化された "char *s "に書き込むと、"char s[]"ではなく、セグメンテーションフォールトが発生するのはなぜですか?]