2008-12-04 3 views
1

Все это происходит от меня тыкать предупреждения компилятора сообщения (C4267) при попытке следующей строки:64 бита портативность вопросы

const unsigned int nSize = m_vecSomeVec.size(); 

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

+0

ТАК почему вы не используете size_t для nSize? C++ очень чувствителен к типу/строго (по дизайну). Поэтому всегда используйте правильный тип. – 2008-12-04 18:05:49

ответ

8

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

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

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

+0

True - size_t может быть недостаточно большим для вектора . – MSalters 2008-12-05 12:24:15

2

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

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

3

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

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

см ниже ссылка для получения дополнительной информации 64 битных портирующих вопросов .. http://www.viva64.com/en/a/0065/

1

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

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