64-битные проблемы переносимости
Все это произошло из-за того, что я попробовал написать следующее предупреждение (C4267):
const unsigned int nSize = m_vecSomeVec.size();
size()
возвращает size_t, который, хотя typedef'd для unsigned int, на самом деле не является unsigned int. Я считаю, что это связано с проблемами переносимости в 64-битной среде, но может ли кто-нибудь объяснить мне это немного лучше? (Я не просто хочу отключить 64-битные предупреждения.)
4 ответа
Это зависит от реализации. std::size_t
например имеет минимально необходимый размер. Но нет верхнего предела. Чтобы избежать подобных ситуаций, всегда используйте правильный typedef:
const std::vector<T>::size_type nSize = m_vecSomeVec.size();
Тогда вы всегда будете в безопасности.
При компиляции для 64-битной платформы, size_t
будет 64-битным типом. Из-за этого Visual Studio выдает предупреждения о назначении size_t
с int
s, когда включена функция "Обнаружение проблем 64-разрядной переносимости".
Visual C++ получает эту информацию о size_t
сквозь __w64
токен, например __w64 unsigned int
,
Обратитесь по ссылке ниже для получения дополнительной информации о проблемах с 64-битным портированием. /questions/796054/tip-fajla-microsoft-office-2007-tipyi-mime-i-identifitsiruyuschie-simvolyi/796071#796071
Если size_t
это typedef:ed для unsigned int
то конечно это unsigned int
на вашей конкретной платформе. Но это абстракция, так что вы не можете зависеть от того, чтобы всегда быть unsigned int
Это может быть больше на другой платформе.
Вероятно, он не был увеличен, поскольку это стоило бы слишком дорого, и, например, векторы с более чем 2^32 элементами в них не очень распространены.
В зависимости от компилятора int
может быть 32-битным в 64-битной земле.