Как вектор скопировать данные в другой вектор? - PullRequest
0 голосов
/ 26 октября 2018

Допустим, у меня есть это:

const int MAX_BUFFER = 1024;
std::vector<double> AV(MAX_BUFFER);
std::vector<double> CV{ AV };

Как AV копируется в CV?

Если у меня то же самое с использованием массива double с (то есть, double[]), потребуется больше (пробовал с профилировщиком на MSVC и /Oi):

for (int sampleIndex = 0; sampleIndex < MAX_BUFFER; sampleIndex++) {
    C[sampleIndex] = A[sampleIndex];
}

Как это копировать быстрее? Как я могу сделать то же самое со стандартом массива C ++?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

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

std::copy(A, A + MAX_BUFFER, B);

Что касается скорости, то это зависит от того, как реализована стандартная библиотека и как компилятор оптимизирует ваш цикл.

0 голосов
/ 26 октября 2018

Трудно ответить с абсолютной уверенностью, так как это зависит от вашей цепочки инструментов и ваших уровней оптимизации и (в некоторой степени) от судьбы.

Возможно, я бы ожидал, что сильный компилятор оптимизирует ваш цикл до memcpy, который не требует счетчиков и отдельных копий значений. Или, возможно, нет. Конечно, кажется, что вы этого не делаете.

Я бы определенно ожидал, что векторная копия сделает это (потому что тот, кто написал реализацию vector, умен и заметил бы эту возможность).

В конечном итоге вам нужно будет прочитать исходный код реализации, чтобы узнать наверняка.

Если вы хотите скопировать содержимое double[] как можно быстрее, используйте std::copy.

Этот должен выполнить эту оптимизацию. Конечно, это не будет медленнее, чем ваш цикл, и может быть быстрее. Если по какой-то причине это не так, вы также можете попробовать прямой memcpy (хотя это устраняет безопасность типов ?).


Почему memcpy быстрее?

Компьютеры быстро разбрасывают блоки байтов за один раз, если они заранее знают, что это то, что вы хотите сделать.

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

В этом контексте «компьютер» представляет собой аморфное сочетание стандартной реализации библиотеки, компилятора и ЦП.

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