Контейнеры стандартной библиотеки, создающие много копий для значений r в GCC

Я пишу приложение как для Linux, так и для Windows, и заметил, что сборка GCC вызывает множество бесполезных вызовов конструктора копирования.

Вот пример кода для создания такого поведения:

struct A
{
    A()                { std::cout << "default" << std::endl; }
    A(A&& rvalue)      { std::cout << "move"    << std::endl; }
    A(const A& lvalue) { std::cout << "copy"    << std::endl; }
    A& operator =(A a) { std::cout << "assign"  << std::endl; return *this; }
};

BOOST_AUTO_TEST_CASE(test_copy_semantics)
{
    std::vector<A> vec_a( 3 );
}

Этот тест просто создает вектор из 3 элементов. Я ожидаю 3 вызова конструктора по умолчанию и 0 копий, так как нет A lvalue.

В Visual C ++ 2010 вывод будет:

default
move
default
move
default
move

В GCC 4.4.0 (MinGW), (-O2 - std = c ++ 0x), вывод будет:

default
copy
copy
copy

Что происходит и как это исправить? Копии дороги для реального класса, конструкция по умолчанию и ходы дешевы. но поскольку ключ будет храниться на хосте, я еще не знаю, противоречит ли это требованиям или нет. Другой вариант, который я рассмотрел, заключается в том, что при запуске веб-приложения оно может запросить ключ у службы и удерживать его в памяти в течение всего срока службы пула приложений.

Мне раньше не приходилось работать с таким уровнем требований к шифрованию, и я хотел бы узнать, что делают другие, и получить отзывы об упомянутых выше идеях.

6
задан Mark J Miller 1 February 2011 в 17:08
поделиться