3

私はいくつかのコードを読んでいて、この例に出くわしました。私が理解できないのは、著者が最後の行で両方の変数から 1 のオフセットを使用する理由です。初期化されていない可能性のあるメモリ領域を参照しているため (セグメンテーション違反が発生する可能性があるため)、一見したところ、これは違法であると思います。私の頭は未定義の動作を教え続けますが、これは本当にそうですか?

static bool lt(wchar_t a, wchar_t b)
{
    const std::collate<wchar_t>& coll =
        std::use_facet< std::collate<wchar_t> >(std::locale());
    return coll.compare(&a, &a+1, &b, &b+1) < 0;
}

最後の行が問題の行です。彼がこれを行う必要があるのはなぜですか、それは合法ですか、いつ行う必要がありますか?

4

3 に答える 3

1

作成者は、現在のグローバル ロケールを使用して 2 つの文字を比較したかっただけのようです。

std::collate<T>::compare2 つの範囲に [low, high) を使用するため、パラメーターのアドレスに 1 を追加すると、a のみが b と比較された後に比較が停止するだけです。無効なメモリ アクセスがあってはなりません。

于 2013-08-01T02:40:19.650 に答える
0

どの本を読んでいるか、何を比較しているかにもよります。

たまたまバッファの先頭にある ID を特定のサイズと比較する必要がある場合があります。

于 2013-08-01T02:44:51.660 に答える
0

関数のテスト

#include <locale>

static bool lt(wchar_t a, wchar_t b)
{
    const std::collate<wchar_t>& coll =
        std::use_facet< std::collate<wchar_t> >(std::locale());
    return coll.compare(&a, &a+1, &b, &b+1) < 0;
}


int main () {

    bool b = lt('a', 'b');
    return 0;
}

デバッガーの内部

Breakpoint 1, main () at test.cpp:13
13      bool b = lt('a', 'b');
(gdb) s
lt (a=97 L'a', b=98 L'b') at test.cpp:6
6           std::use_facet< std::collate<wchar_t> >(std::locale());
(gdb) p &a
$1 = 0x7fffffffdddc L"a\001翿\x400885"
(gdb) p &a+1
$2 = 0x7fffffffdde0 L"\001翿\x400885"

このことから私は信じています

  1. コードは合法です
  2. しかし&a + 1、おそらく初期化されていないメモリを参照しています

gdb が返すものから、 a のアドレスを取得するとaがwchar_t返されると考える傾向があります。私は正しいですか?char*&aawchar_tchar*a&a+1

于 2013-08-01T02:58:07.267 に答える