-3
struct forcePin {
    char _name[512];
};

struct forcePin *_forcePin[500000];    
_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

以下に示す行が何をしているかわかりますか?

_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

この行をC++形式にする方法を教えていただければ、私はcに精通していません。ありがとう

4

5 に答える 5

7

動的メモリ割り当ては C では非常に重要であるため、適切に学習する必要があります。

問題の行が行うことは、ヒープ、つまりsizeof(struct forcePin)バイトからメモリを割り当てることです。このmalloc関数は、この割り当てられたメモリへの汎用ポインターを返し、そのポインターはポインターに割り当てられます_forcePin[i]

その行についての 1 つのことは、関数の戻り値を型キャストしないmallocでください。


C++ では、次のnewステートメントを使用してポインターを割り当てます。

_forcePin[i] = new forcePin;

ただし、C++ では、ポインターと動的ヒープ割り当てを使用することはお勧めできません。std::vector代わりに、非ポインター構造のa を使用することをお勧めします。

struct forcePin {
    std::string name;
};

std::vector<forcePin> forcePin;
forcePin.push_back(forcePin{});
于 2013-07-10T08:23:48.897 に答える
4

動的(「ヒープ」)メモリのバイトを割り当てるために、標準ライブラリ関数malloc()を呼び出しています。sizeof (struct forcePin)

次に、返されたポインタを無意味にキャストし、変数に格納しています_forcePin[i]

これは、このコードを記述する最適な方法ではありません。私の意見では、次のようにする必要があります。

_forcePin[i] = malloc(sizeof *_forcePin[i]);

割り当てがループから外れている場合 (i暗黙のように)、そのコードは 512 * 500,000 バイト、または約 244 MB のメモリを割り当てているように見えることに注意してください。50 万回の割り当て呼び出しで行われるため、かなりのオーバーヘッドも発生します。

すべてのメモリが本当に必要な場合は、1 回のmalloc()呼び出しを試みてから、割り当てられたバッファを 500,000 個の部分に分割することをお勧めします。そのようにすると、費用がかかる可能性があり、50 万回の呼び出しが多いため、高速になる可能性が非常に高くなりますが、500,000 ではなく1 つのmalloc()オーバーヘッド コストがあるため、確実にメモリを節約できます。

于 2013-07-10T08:23:56.237 に答える
1
_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

サイズ のメモリ ブロックを割り当て、割り当てられたメモリを ( ) から型forcePinにキャストします。C++ では、次のようにします。void *forcePin

_forcePin[i] = new forcePin();

またはさらに良いことに、次のものを使用できます。

std::vector<forcePin> vec;
vec.push_back(forcePin());
于 2013-07-10T08:25:17.377 に答える
0

あなたが尋ねる行は、メモリのブロックを割り当て ( を参照malloc())、そのアドレスを_forcePinindex の配列に格納しますi

C++ では、次のように使用しますnew_forcePin[i] = new forcePin

于 2013-07-10T08:24:47.227 に答える