Постойте, вы получаете sizeof()
значения от Intellisense или от компилятора?То есть пытались ли вы скомпилировать и запустить что-то вроде этого:
#include <cstdio>
int main()
{
::printf("%d\n", sizeof(void*));
return 0;
}
Я спрашиваю, потому что из опубликованных вами снимков экрана видно, что вы используете Intellisense для определения того, что sizeof()
оценивает.
Intellisense - это нечто совершенно отдельное от компилятора.Это просто инструмент, который пытается проанализировать ваш (вероятно, неполный) код для целей автозаполнения.Он может знать или не знать о конкретных настройках компилятора / компоновщика, таких как /MACHINE:X64
, поэтому sizeof(void*)
может давать неправильные значения.
С другой стороны, UINT_PTR
определяется с помощью макросов #ifdef
и является целымтакие типы, как unsigned long
или unsigned __int64
, которые в этом случае Intellisense сможет дать правильные размеры.
Компилятор и компоновщик - это программы, которые фактически генерируют код и, таким образом, имеют окончательное мнение о том, что sizeof()
на самом деле оценивается в.Вы должны скомпилировать и запустить приведенный выше фрагмент кода и посмотреть фактический результат.Я получаю 8
под 64-битными и 4
под 32-битными.Intellisense - это всего лишь вспомогательный инструмент, который не имеет никакого отношения к окончательному выводу исполняемого файла.
Если у вас нет немедленного доступа к 64-битной машине для тестирования приведенного выше кода, вы можете вместо этогопопробуйте скомпилировать это:
template<unsigned long Size> struct TestSize; // #1
template<> struct TestSize<8> {}; // #2
int main()
{
// If sizeof(void*) == 8, then #2 will be used.
// Otherwise, #1 will be used. Since #1 hasn't
// been completely defined, this line will fail
// to compile if sizeof(void*) != 8.
TestSize<sizeof(void*)>();
}
Благодаря магии шаблонов (т.е. специализации шаблонов) приведенный выше фрагмент должен компилироваться только тогда, когда sizeof(void*)
равно 8. Вам не нужно запускать полученный исполняемый файл;тот факт, что он компилируется, означает, что sizeof(void*) == 8
.