2017-05-13 12 views
1

つまり、呼び出されるたびにmalloc()システムコールは実行されるのでしょうか? (あらかじめ大きなチャンクを割り当てておいた場合)C++ new演算子はmalloc()を下に使用しますか?

+3

実装に依存しています。 –

+1

mallocはシステムコールではなく、Standard Cライブラリの関数です。 –

+0

@Neilそれを採用しました。 –

答えて

0

つまり、呼び出されるたびにmalloc()システムコールは実行されるのでしょうか?

これは実際に実装に依存しています。しかし、通常newの実装では、malloc() syscalls/c-libraryバインディングが使用されます。

(事前に多分割り当てによって大きな塊)

はい、あなたは欠点としてそれを考慮する必要があります。単一charが必要になるよりも頻繁に、割り当てられた大きなチャンクを不必要に動的なストレージスペースを乱雑にも

char* newChar = new char(); 

のようなものを呼び出します。

さらに効率的なメモリ管理のためにその動作をオーバーライドする場合は、いつでもplacement newを使用できます。

0

他の人が言っているように、これは実装定義です。しかし、高性能なC++実装ではおそらくmalloc()は使用されませんが、OS特有のメモリ割り当てAPIやシステムコール(malloc()はそれ自身で使用する必要があります)を使用すると思います。結局のところ、すべてのメモリ割り当てに特別な関数呼び出しを追加するのはなぜですか?しかし、私はこれについての確かな証拠はありません。

0

C++ 14より前では、実装では実装の割り当てを禁止していました。そのため、それぞれのnew式は、システム割り当て関数(おそらくmalloc)の呼び出しと1対1で対応していました。

C++ 14 relaxed this restrictionである場合がある。 1つのライフタイムが厳密に他のライフタイムの寿命内にある場合、実装は割り当てを組み合わせることが可能になりました。しかしこれはかなり狭い制限ですので、実際には割り当てを実際に組み合わせることはしません。

関連する問題