2

重複の可能性:
char より大きい整数を受け入れる memset() はありますか?

memset の宣言でわかるように:

void * memset ( void * ptr, int value, size_t num );

この memset 関数 (または STL ライブラリに含まれる別の関数) を使用して、メモリをlong long型の値に設定する方法はありますか?

これを使用して、long long の配列を大きな値で初期化します。

配列の各値を繰り返し処理し、目的の値に設定するだけで、この問題を「解決」したと言わざるを得ません。

4

4 に答える 4

6

memset渡された値の 1 バイトのみを使用し、バイトごとの初期化を行います。long long特定の値で配列を初期化する場合は、 std::fillorstd::fill_nを使用して、ライブラリとコンパイラが可能な限り最適化できるようにします (部分的なループ展開など)。

もう 1 つの標準的な C++ の方法は、単に使用vectorして、そのコンストラクターに作業を任せることです。

std::vector<long long> foo(length_of_array, 12345678901234LL);

于 2011-10-25T17:59:28.033 に答える
3

memcpy を使用すると遅いように思えます。コンパイラでネイティブの 64 ビット整数がサポートされています。この場合、リリース モードでコンパイルしている場合、この関数は int64 を直接使用するとより効率的になります。ただし、この関数が現在記述されているように、count は 8 の倍数としてのみサポートされていることを考慮してください。任意の種類のバイト数を処理する必要がある場合は、リトル エンディアン ビッグ エンディアンの問題に対処する必要があります。

inline void memset64(void* buffer, int64 value, size_t count)
{
    const size_t m = count / 8;
    int64* p = (int64*)buffer;
    for (size_t i = 0; i < m; ++i, ++p)
        *p = value;
}

しかし、私たちは C++ を使用していますよね? より C++ 指向のものを使用しましょう。

template <typename T>
inline void fillarray(T* buffer, const T& value, size_t count)
{
    for (int i = 0; i < count; ++i)
        buffer[i] = value;
}

コメントに記載されているように、機能もありますstd:fill

于 2011-10-25T17:42:30.130 に答える
0

memset は「値」の下位 8 ビットのみを使用します。これは、単一の値をすべてのメモリ位置にコピーすることを意味します。エンディアンなどの問題を引き起こす可能性のあるマルチバイト値を処理しようとはしません。

メモリを long long 値で埋めたい場合、なぜそれをしたいのか知りたいと思うでしょう - おそらくもっと良い方法があるでしょう。

于 2011-10-25T17:24:14.177 に答える
0

memcpy関数を使用してこれを行うことができます。long long 型が 8 バイトであると仮定すると、次のようなことができます。

long long mylonglong=...;
char memory[8];

// Copy the value of a long long into a character array
memcpy(memory,&mylonglong,8);
于 2011-10-25T17:25:16.707 に答える