Архитектура X86 — задает размер вектора с помощью unsigned long long

#c #vector #visual-c #x86 #unsigned-long-long-int

# #c #вектор #visual-c #x86 #unsigned-long-long-int

Вопрос:

Когда я пытаюсь установить размер вектора с помощью unsigned long long в архитектуре x86, я вижу ошибку ниже:

 unsigned long long sz;
vec.resize(sz);
 

ошибка C4244: ‘аргумент’: преобразование из ‘unsigned __int64’ в ‘const
unsigned int’, возможна потеря данных

Почему эта ошибка? каково поведение unsigned long long в архитектуре x86? Как установить размер вектора с помощью unsigned long long значение в архитектуре x86?

Комментарии:

1. Почему эта ошибка? Прочитайте документацию . Где unsigned long long указан тип для использования?

2. Размеры — size_t, а не unsigned long long

Ответ №1:

Используйте size_t sz как обычный человек, это std::vector::resize(size_t) ожидаемый тип аргумента, поэтому использование того же типа будет означать отсутствие неявного преобразования и, следовательно, сужения.

unsigned long long это 64-разрядный тип, но size_t только 32-разрядный, в 32-разрядном коде.

Вы не можете иметь std::vector значение больше, чем SIZE_MAX , поэтому бессмысленно использовать более широкий целочисленный тип. Это все, на что жалуется MSVC. Это не ошибка, если у вас никогда не было большого значения sz , но вы, по-видимому, настроили MSVC на очень педантичный подход и рассматриваете предупреждения как ошибки.

В этом неявном преобразовании нет необходимости в первую очередь; избегайте его, используя соответствующий тип.

Комментарии:

1. MSVC не жалуется на бессмысленность использования более широкого целочисленного типа. Это предупреждает вас о неявных преобразованиях целых чисел, которые, на мой взгляд, являются самой большой ошибкой языка C . Смотрите документацию для C4244 . Это предупреждение для -W3 и -W4. Вы правы в том, что у запрашивающего явно установлен параметр -Werror , но я думаю, что вы слишком пренебрежительно относитесь к полезности этого предупреждения, особенно в общем случае.

2. @CodyGray: Спасибо, исправлено. Это то, что я имел в виду (что неявное преобразование было бессмысленным, а не предупреждение), но, конечно, если бы кто-то знал C достаточно хорошо, чтобы понять мою точку зрения из того, что я изначально написал, им не нужно было бы задавать вопрос. Мой ответ был простым, потому что изначально он должен был быть комментарием. Я надеялся на более интересный вопрос, основанный на названии, но vector std::vector не был вектором SIMD, и не было ничего специфичного для x86, просто платформа с 32-разрядной size_t версией. :/

3. Ха-ха, да, я почувствовал разочарование с самого первого предложения. Я тоже усмехнулся.