このプログラム(オプションでコンパイル-std=c++17
)
#include <stdio.h>
#include <string>
void* operator new(std::size_t nrOfBytes) {
printf("allocate %zd bytes on heap\n", nrOfBytes);
void* p = malloc(nrOfBytes);
if (p) {
return p;
} else {
throw std::bad_alloc{};
}
}
int main() {
// new operator is called when compiled with Clang or MSVS or GCC
int* i = new int;
delete i;
// new operator is not called when compiled with GCC
// but is called with Clang and MSVS
std::string str(2000, 'x');
return 0;
}
ClangまたはMSVSでコンパイルすると、次のように出力されます。
ヒープに4バイトを割り当てる
ヒープに2016バイトを割り当てる
ただし、GCC(Windows上のMSYSによって提供されるバージョン9.2.0)でコンパイルされた場合は、次の内容のみが出力されます。
ヒープに4バイトを割り当てる
GCC / libc ++での短い文字列の最適化を知っていますが、短い文字列に対して2000文字が多すぎませんか?それはSSOの問題ですか?
コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました。
—
Samuel Liew