私はフリーメモリチャンクのリストとして表現するメモリプールを持っており、事前割り当てメモリにオブジェクトを格納するために、このオブジェクトを個別に割り当てるよりも高速かもしれないので、このチャンクを "placement new"事前に割り当てられたメモリにオブジェクトを作成するのはなぜですか?オブジェクトを個別に割り当てることでオブジェクトを作成するのはなぜですか?
「新しい」キーワードを使用してオブジェクトを作成するコードスニペットが2つあります。
最初にコードがスローされました:メモリプールによって提供されたメモリを使用して、 "配置new"で事前割当メモリで作成されたオブジェクト。 2番目のコードがスローされました。事前割り当てメモリを使用せずに作成したオブジェクト。「新規」のみです。
プレースメントに基づいて切り取られた理由が、プレースメントなしで切り取られたものより新しいのはなぜですか?
まず切り取ら:
#include <chrono>
#include <iostream>
struct list
{
list *next;
};
class Test
{
public:
int a;
int b;
};
void* getPtr()
{
static int init = 0;
static list *head;
static list *free;
if (!init) {
std::cout << "Initialized." << std::endl;
init = 1;
list *head = reinterpret_cast<list*>(new char(sizeof(Test)));
free = head;
for (int i = 0; i < 10000000; i++) {
head->next = reinterpret_cast<list*>(new char(sizeof(Test)));
head = head->next;
}
}
list *ret = free;
free = ret->next;
return ret;
}
int main()
{
getPtr();
auto begin = std::chrono::high_resolution_clock::now();
for(int i = 0; i < 10000000; i++) {
new(getPtr())Test();
}
auto end = std::chrono::high_resolution_clock::now();
std::cout<<std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count()<<" ns"<< std::endl;
}
第二には、少なくとも、(私は前のメモリプールを書いたことがありませんが、私はあなたがアカウントを取りたいと思います
#include <chrono>
#include <iostream>
class Test
{
public:
int a;
int b;
};
int main()
{
auto begin = std::chrono::high_resolution_clock::now();
for(int i = 0; i < 10000000; i++) {
new Test();
}
auto end = std::chrono::high_resolution_clock::now();
std::cout<<std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count()<<" ns"<< std::endl;
}
正確なコンパイラのバージョンとコンパイルコマンドを教えてください。最適化されていない/デバッグビルドのパフォーマンスはまったく意味がないことに注意してください。 clangは2番目の例のループ全体を最適化することにも注意してください。 –
C++のマイクロベンチマークでは、[this talk](https://youtu.be/nXaxk27zwlk)などの学習資料を見たいと思っています。考えているよりも難しいです。 –
私はgccコンパイラを使用しています。http://rextester.com/DOS20329 –