Я искал, но не мог найти ответ на это. Есть ли способ рассказать new
оператор для не называть конструкторы классов?
MyObject* array = new MyObject[1000];
Это позвонит MyObject()
тысячи раз! Я хочу заполнить выделенную память самостоятельно, и мне не нужна информация, инициализированная в конструкторе. С помощью malloc()
не очень гармоничный код C ++ imho.
MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000);
C ++ эквивалентно malloc
функция распределения operator new
, Вы можете использовать это так:
MyObject* array = static_cast<MyObject*>(::operator new(sizeof(MyObject) * 1000));
Затем вы можете сконструировать конкретный объект с размещением нового:
new (array + 0) MyObject();
замещать 0
с любым смещением, которое вы хотите инициализировать.
Однако мне интересно, действительно ли вы хотите сделать это динамическое распределение самостоятельно. Возможно std::map<int, MyObject>
или же std::unordered_map<int, MyObject>
подойдет вам лучше, так что вы можете создать MyObject
по любому индексу.
std::unordered_map<int, MyObject> m;
m[100]; // Default construct MyObject with key 100
Действительно, использование malloc не очень гармонично с кодом C ++. Но malloc делает именно то, что вы просите. Поэтому я боюсь, что то, что вы просите, не очень гармонично с C ++. Я думаю, вы просто должны решить, какой язык вы бы предпочли программировать на C или C ++.
Я полагаю, что ваш единственный реальный вариант — переписать MyObject, чтобы у него не было конструкторов, но это не совсем C ++.
просто используйте std :: vector
std::vector<MyObject> v;
v.reserve(1000); // allocate raw memory
v.emplace_back(42); // construct in place
для произвольного доступа (это (в основном) то, что делает std :: vector внутри):
typedef std::aligned_storage<sizeof(MyObject), std::alignment_of<MyObject>::value>::type Storage;
MyObject* myObjects(reinterpret_cast<MyObject*>(new Storage[1000]));
new (myObjects + 42) MyObject(/* ? */); // placement new
(*(myObjects + 42)).~MyObject();
Вы рассчитали это? Это займет слишком много времени? Это происходит только один раз при выполнении вашей программы, как в начале? Сначала определите, что это на самом деле проблема.
Вам действительно нужно распределить 1000 объектов таким образом?
Кроме того, если конструкторы не будут вызваны, как объекты будут … построены?