Проблемы переносимости 64-битной версии

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

const unsigned int nSize = m_vecSomeVec.size();

size() возвращает size_t, который, хотя typedef имеет значение unsigned int, на самом деле не является unsigned int. Я считаю, что это связано с проблемами переносимости 64-битной версии, однако может ли кто-нибудь объяснить это немного лучше для меня? (Я не просто хочу отключить 64-битные предупреждения.)


person Konrad    schedule 04.12.2008    source источник
comment
ТАК почему вы не используете size_t для nSize? С++ очень чувствителен к типу/строгий (по замыслу). Поэтому всегда используйте правильный тип.   -  person Martin York    schedule 04.12.2008


Ответы (4)


Это зависит от реализации. Например, std::size_t имеет минимально необходимый размер. Но верхнего предела нет. Чтобы избежать подобных ситуаций, всегда используйте правильный typedef:

const std::vector<T>::size_type nSize = m_vecSomeVec.size();

Тогда вы всегда будете в безопасности.

person Johannes Schaub - litb    schedule 04.12.2008
comment
Верно - size_t может быть недостаточно большим для vector‹bool›. - person MSalters; 05.12.2008

При компиляции для 64-битной платформы size_t будет 64-битным типом. Из-за этого Visual Studio выдает предупреждения о назначении size_ts для ints, когда включен параметр «Обнаружение проблем с 64-разрядной переносимостью».

Visual C++ получает эту информацию о size_t через токен __w64, например. __w64 unsigned int.

Перейдите по ссылке ниже, чтобы узнать больше о проблемах переноса 64-разрядных версий. http://www.viva64.com/en/a/0065/

person James Hopkin    schedule 04.12.2008

Если size_t определяется как unsigned int, то, конечно, это unsigned int на вашей конкретной платформе. Но он абстрагирован, так что вы не можете полагаться на то, что он всегда будет unsigned int, он может быть больше на какой-то другой платформе.

Вероятно, он не был увеличен, так как это было бы слишком дорого, и, например. векторы, содержащие более 2^32 элементов, встречаются не очень часто.

person unwind    schedule 04.12.2008

В зависимости от компилятора int может быть 32-битным в 64-битной стране.

person MSN    schedule 04.12.2008