memset の宣言でわかるように:
void * memset ( void * ptr, int value, size_t num );
この memset 関数 (または STL ライブラリに含まれる別の関数) を使用して、メモリをlong long型の値に設定する方法はありますか?
これを使用して、long long の配列を大きな値で初期化します。
配列の各値を繰り返し処理し、目的の値に設定するだけで、この問題を「解決」したと言わざるを得ません。
memset の宣言でわかるように:
void * memset ( void * ptr, int value, size_t num );
この memset 関数 (または STL ライブラリに含まれる別の関数) を使用して、メモリをlong long型の値に設定する方法はありますか?
これを使用して、long long の配列を大きな値で初期化します。
配列の各値を繰り返し処理し、目的の値に設定するだけで、この問題を「解決」したと言わざるを得ません。
memset
渡された値の 1 バイトのみを使用し、バイトごとの初期化を行います。long long
特定の値で配列を初期化する場合は、 std::fill
orstd::fill_n
を使用して、ライブラリとコンパイラが可能な限り最適化できるようにします (部分的なループ展開など)。
もう 1 つの標準的な C++ の方法は、単に使用vector
して、そのコンストラクターに作業を任せることです。
std::vector<long long> foo(length_of_array, 12345678901234LL);
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
memset は「値」の下位 8 ビットのみを使用します。これは、単一の値をすべてのメモリ位置にコピーすることを意味します。エンディアンなどの問題を引き起こす可能性のあるマルチバイト値を処理しようとはしません。
メモリを long long 値で埋めたい場合、なぜそれをしたいのか知りたいと思うでしょう - おそらくもっと良い方法があるでしょう。
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);