2016-01-25 4 views
0

В Windows с использованием VS2013 я использую ._MyFirst и ._MyLast, чтобы получить указатели на первый и последний элементы вектора для быстрой манипуляции с помощью приращения указателя.Linux C++ ._MyFirst ._MyLast vector equivilent

vec._MyFirst->element = anotherElement; 
vec._MyFrist++; 

В Linux, хотя это, похоже, не существует, но я полагаю, что его эквивалент должен быть эквивалентным. Кто-нибудь знает, что это такое?

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

_MyFirst - это прямой указатель, который используется самим вектором для первого элемента, и _MyLast указывает на последний элемент. Вместо использования итератора гораздо быстрее пройти через вектор, меняющий адрес памяти указателя, поэтому я их и использую. Кроме того, если вектор когда-либо изменен, то ._MyFirst и ._MyLast всегда укажут на первый и последний элементы. На linux их нет под этим именем.

Спасибо

+7

Это массовое нестандартное. Что не так с 'vec.begin();' и 'vec.end()'? Итераторы будут просто очень тонкие обертки вокруг указателей, в любом случае, почти все, что от них зависит. (Фактически, они могут даже * быть * указателями). Существуют * стандартные способы получения указателей на данные, например ['vec.data()'] (http://en.cppreference.com/w/cpp/container/vector/data), но они могут не быть подходящим для того, что вы делаете. – BoBTFish

+3

@bob, как предполагалось, ОП заметил, что это было быстрее ... в отладке, где итераторы имеют дополнительные проверки. Тогда не было проверки в выпуске. – Yakk

+0

Это правильно! Поскольку я выполняю свой тест в режиме отладки и работая с облаками точек, которые имеют +600000 точек, он может стать очень медленным, поэтому использование _MyFirst и _MyLast делает меньше проверок и имеет намного меньшие накладные расходы. – user1031204

ответ

3

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

auto fPtr = vec.data(); 
auto ePtr = fPtr + vec.size(); 
+0

Векторы, с которыми я работаю, сильно изменяются, таким образом, _MyFirst и _MyLast всегда обновляются в актуальном состоянии – user1031204

1

ОК, я вижу, что вы ищете производительность с информацией об отладке. Один из способов (как вы это делаете) - собрать сборку отладки без каких-либо оптимизаций, а затем попытаться «оптимизировать исходный код вручную», написав нестандартный код.

Другим, конечно же, является создание стандартного кода и просто оптимизация и отладка.

Я сделал иллюстрации затрат написания правильного кода некоторое время назад при ответе this question

TL; DR - есть нулевой накладные расходы.

1

Вы также можете получить указатели с:

auto sPtr = &vec.front(); 
auto lastPtr = &vec.back(); 

Конечным указатель на одну позицию после последнего элемента:

auto ePtr = lastPtr + 1; 

Примечание: Для данных() метод вам нужен C++ 11 или более поздней. VS 2013 поддерживает его частично, но под Linux вам может потребоваться сказать ему, что он использует этот стандарт.

 Смежные вопросы

  • Нет связанных вопросов^_^