скрытая копия в векторе STL? - PullRequest
1 голос
/ 29 июня 2011

Я испытываю неожиданное снижение производительности при использовании векторов с классами.

У меня есть класс csv_File, который читает в файле csv и сохраняет содержимое в двухмерном векторе. Есть функция-член, которая разрешает доступ, например,

    csv_File file("file.csv");
    file.access(2,2);

Для доступа к элементу 2,2.

Затем у меня есть другой класс csv_Array, который хранит несколько объектов csv_File в векторе, например, закрытый вектор-член Есть функция-член, которая разрешает доступ, то есть возвращает объект csv_File, например:

    csv_Array file_array(5); //store 5 csv_File objects
    file_array.grab(0).access(2,2); 

Во второй строке grab возвращает объект csv_File (в данном случае первый), а access является функцией-членом объекта csv_File.

Однако я заметил, что звонок csv_Array.grab (0) .access (2,2); намного медленнее, чем должно быть (должно быть всего 3 вектора :: при вызовах).

Есть ли какая-то скрытая копия, которая делает это очень медленным?

РЕДАКТИРОВАТЬ: Вот некоторые из соответствующих прототипов функций:

    //Access in csv_File
    std::string access(int row, int column);

    //grab in csv_Array and csv_Analysis (mentioned below)
    csv_File grab(int index);

ДОПОЛНИТЕЛЬНЫЕ ДАННЫЕ (при необходимости): Применение этого кода состоит в том, чтобы загрузить несколько файлов CSV в память, а затем передать их классу-другу, который проведет некоторые вычисления с данными. Схематично у меня следующее:

1) csv_Array имеет закрытое векторное хранилище элементов; 2) csv_Analysis - класс, являющийся другом csv_Array 3) csv_Analysis обращается к векторному хранилищу, которое находится в csv_Array 4) Этот доступ осуществляется путем передачи csv_Analysis ссылки на хранилище в csv_Array (так что, надеюсь, не копировать ....), например общественности: csv_Analysis (csv_Array & csv_block);

Таким образом, вызов, указанный выше [file_array.grab (0) .access (2,2); ] на самом деле имеет один дополнительный класс "уровень" между ними и больше похож на

    csv_Analysis analysis_Object(file_array); 
    analysis_Object.grab(0).access(2,2); 

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

Ответы [ 2 ]

5 голосов
/ 29 июня 2011

Возможно, вы захотите grab вернуть ссылку, а не копию:

csv_File& grab(int index);
0 голосов
/ 29 июня 2011

Было бы очень полезно, если бы вы показали, как именно объявляются функции, особенно возвращаемые значения.Я подозреваю, что вы возвращаете копию вместо ссылки, но пока не могу сказать.

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