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с ints, когда включена функция "Обнаружение проблем 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-битной земле.

Другие вопросы по тегам