
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.121] |
![]() |
|
Сообщ.
#1
,
|
|
|
Для ускорения обработки при записи/чтении фала решил вместо sizeof(int), sizeof(char) и т.д. вписывать точное значение, у меня выдает что int это 4 байта, char это 1 байт.
Но потом задался вопросом, а будет ли также на других машинах, например не с XP, с Win7, WinServer 2003/2008, на х64. Интересуют только разные виндовсы. Или на 64 разрядном виндовсе int может быть не 4, а 8 байт??? ![]() ![]() Добавлено Нет под рукой других операционных систем, только WinXP x86 |
Сообщ.
#2
,
|
|
|
Цитата secondd @ Для ускорения обработки при записи/чтении фала решил вместо sizeof(int), sizeof(char) и т.д. вписывать точное значение, у меня выдает что int это 4 байта, char это 1 байт. Никакого ускорения не добиться: запись sizeof(int) вычисляется на этапе компиляции и равносильна тому, что ты сам пишешь просто 4. Все дело в переносимости и модернизируемости. Цитата secondd @ Но потом задался вопросом, а будет ли также на других машинах, например не с XP, с Win7, WinServer 2003/2008, на х64. Интересуют только разные виндовсы. Типы данных это соглашения о размерах (структуре и т.п., но сейчас не важно) данных на момент компиляции для конкретного компилятора, который в свою очередь рассчитан для создания кода под определенную программно-платформу. |
Сообщ.
#3
,
|
|
|
Аааа... Вот оно что!
То есть на всех виндовских платформах эи типы имеют одинаковый размер. Спасибо!!! |
Сообщ.
#4
,
|
|
|
Цитата secondd @ То есть на всех виндовских платформах эи типы имеют одинаковый размер. Нет, терминологически это честно говоря несуразица, но в данном случае, если говорить это с точки зрения единожды скомпилированного exe-шника, то для простоты можно наверное считать так. |
![]() |
Сообщ.
#5
,
|
|
Цитата secondd @ То есть на всех виндовских платформах эи типы имеют одинаковый размер. Одинаковый платформеннонезависимый размер имеют полноописанные типы: short int - 2 байта long int - 4 бата long long - 8 байт Недостаток (или преимущество) С++ в том, что можно не указывать как signed/unsigned так и short/long. Т.е можно писать просто short или просто int, а тут уже стандарт не действует и размер типа выбирается просто из целесообразности (исходя из разрядности ЦП, типа ОС или просто компилятора). |
Сообщ.
#6
,
|
|
|
Цитата Chow @ Это не так. В C/C++ только char в трех его разновидностях имеет фиксированный размер: sizeof(char) = sizeof(signed char) = sizeof(unsigned char) = 1, размер любых других - платформозависим. Кстати, 1 означает "один байт", а не "один октет".Одинаковый платформеннонезависимый размер имеют полноописанные типы: short int - 2 байта long int - 4 бата long long - 8 байт Добавлено Цитата secondd @ Размеры типов определяются компилятором, хотя, как правило, разработчиками компиляторов размер выбирается исходя из архитектуры целевой платформы. Например, тип int обычно имеет разрядность АЛУ при выполнении базовых операций(но как раз x64 здесь похоже является исключением), а типы float и double обычно соответствуют одинарной и двойной точности IEEE754. То есть на всех виндовских платформах эи типы имеют одинаковый размер. |
Сообщ.
#7
,
|
|
|
Цитата trainer @ Например, тип int обычно имеет разрядность АЛУ при выполнении базовых операций(но как раз x64 здесь похоже является исключением) "Исключением" является не только x64, но и, например, 16-битные режимы IA-32. Поэтому правильнее говорить, что тип int обычно имеет разрядность операнда по умолчанию для данного режима работы процессора. В 64-битном режиме x86-64 размер адреса по умолчанию равен 64 битам, а размер (целочисленного) операнда - 32 битам, и соотв-но оптимальный размер int также составляет 32 бита |
Сообщ.
#8
,
|
|
|
Цитата leo @ 16-битный режим является наследием 8086 с 16-битным АЛУ и по сути эмулируется в 32-разрядных x86, почему Intel засунула 16-разрядные 8086/8088, 80186/80188 и 80286 в IA-32, или почему она линейке x86 дала имя IA-32 - неясно. Действительным исключением являются также 8-разрядные процессоры и микроконтроллеры. "Исключением" является не только x64, но и, например, 16-битные режимы IA-32. |
Сообщ.
#9
,
|
|
|
Цитата trainer @ 16-битный режим является наследием 8086 с 16-битным АЛУ и по сути эмулируется в 32-разрядных x86, почему Intel засунула 16-разрядные 8086/8088, 80186/80188 и 80286 в IA-32, или почему она линейке x86 дала имя IA-32 - неясно Странные вещи говоришь, т.к. с точки зрения самого 64-разрядного АЛУ пофиг с какими операндами работать - 8, 16, 32 или 64 (только флаги нужно устанавливать соотв.образом). Более того, такие операции как целочисленное деление, выполняются намного быстрее над "короткими" операндами, чем над "длинными". Поэтому 16-битные операции никто не отменял ни в IA-32, ни в AMD64\EM64T. И 16-битные ОС типа DOS, кстати, тоже. Поэтому проблема тут не в самом АЛУ, а в системе команд, в которой нужно как-то указывать размер операнда для каждой команды. Поэтому в x86 (по традиции) только 8-битные операции кодируются особо, а для 16,32 и 64 используются одни и те же коды команд с префиксами переопределения размера операнда. 64-битные всегда идут с префиксом (что приводит к увеличению размера кода при их злоупотреблении). А для 16 и 32 вводится понятие размера по умолчанию - в 64 и 32-битных ОС по умолчанию устанавливается 32 бита и соотв-но 32-разрядные операции не требуют префикса, а 16 требуют. В 16-битной DOS ес-но наоборот |
Сообщ.
#10
,
|
|
|
Ну ты еще MMX сотоварищи вспомни. Они не в АЛУ выполняются.
АЛУ почти пофиг с какой разрядностью конкретная команда, ибо в x86 команда транслируется в набор микрокоманд, которые и исполняются. |