std :: vector :: emplace против размещения new - PullRequest
0 голосов
/ 07 марта 2019

Когда я хочу построить объект внутри вектора, я могу написать следующий код:

class NonTrivialType {
    NonTrivialType() = default;
    NonTrivialType(InitParam param){/* implementation */};
};

// array with 100 default-constructed objects in it
std::vector<NonTrivialType> data(100);

int main(){
    // prepare some init parameters
    InitParam param{/* some data */};
    // construct an object at 50th position
    data.emplace(data.begin()+49, param);
}

Что отлично работает, но, кажется, генерирует больше кода, чем если бы я использовал вместо этого новое место размещения, например:

int main(){
    // prepare some init parameters
    InitParam param{/* some data */};
    // construct an object at 50th position
    new (&data[49]) NonTrivialType{param};
}

Мой вопрос: зачем мне использовать emplace вместо размещения new?

1 Ответ

5 голосов
/ 07 марта 2019

Ваши программы не эквивалентны.

data.emplace(data.begin()+49, param); вставляет новый элемент в вектор.Это увеличивает размер вектора и смещает элементы за точку вставки.

new (&data[49]) NonTrivialType{param}; перезаписывает существующий элемент.Без разрушения существующего в первую очередь и, следовательно, вызывающего неопределенного поведения, если NonTrivialType имеет нетривиальный деструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...