На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> sizeof(int) на х86 и х64 , будет разница?
    Для ускорения обработки при записи/чтении фала решил вместо sizeof(int), sizeof(char) и т.д. вписывать точное значение, у меня выдает что int это 4 байта, char это 1 байт.

    Но потом задался вопросом, а будет ли также на других машинах, например не с XP, с Win7, WinServer 2003/2008, на х64. Интересуют только разные виндовсы. Или на 64 разрядном виндовсе int может быть не 4, а 8 байт??? :-? :-?

    Добавлено
    Нет под рукой других операционных систем, только WinXP x86
      Цитата secondd @
      Для ускорения обработки при записи/чтении фала решил вместо sizeof(int), sizeof(char) и т.д. вписывать точное значение, у меня выдает что int это 4 байта, char это 1 байт.

      Никакого ускорения не добиться: запись sizeof(int) вычисляется на этапе компиляции и равносильна тому, что ты сам пишешь просто 4. Все дело в переносимости и модернизируемости.

      Цитата secondd @
      Но потом задался вопросом, а будет ли также на других машинах, например не с XP, с Win7, WinServer 2003/2008, на х64. Интересуют только разные виндовсы.

      Типы данных это соглашения о размерах (структуре и т.п., но сейчас не важно) данных на момент компиляции для конкретного компилятора, который в свою очередь рассчитан для создания кода под определенную программно-платформу.
        Аааа... Вот оно что!
        То есть на всех виндовских платформах эи типы имеют одинаковый размер.
        Спасибо!!!
          Цитата secondd @
          То есть на всех виндовских платформах эи типы имеют одинаковый размер.

          Нет, терминологически это честно говоря несуразица, но в данном случае, если говорить это с точки зрения единожды скомпилированного exe-шника, то для простоты можно наверное считать так.
            Цитата secondd @
            То есть на всех виндовских платформах эи типы имеют одинаковый размер.

            Одинаковый платформеннонезависимый размер имеют полноописанные типы:
            short int - 2 байта
            long int - 4 бата
            long long - 8 байт

            Недостаток (или преимущество) С++ в том, что можно не указывать как signed/unsigned так и short/long.
            Т.е можно писать просто short или просто int, а тут уже стандарт не действует и размер типа выбирается просто из целесообразности (исходя из разрядности ЦП, типа ОС или просто компилятора).
              Цитата Chow @
              Одинаковый платформеннонезависимый размер имеют полноописанные типы:
              short int - 2 байта
              long int - 4 бата
              long long - 8 байт
              Это не так. В C/C++ только char в трех его разновидностях имеет фиксированный размер: sizeof(char) = sizeof(signed char) = sizeof(unsigned char) = 1, размер любых других - платформозависим. Кстати, 1 означает "один байт", а не "один октет".

              Добавлено
              Цитата secondd @
              То есть на всех виндовских платформах эи типы имеют одинаковый размер.
              Размеры типов определяются компилятором, хотя, как правило, разработчиками компиляторов размер выбирается исходя из архитектуры целевой платформы. Например, тип int обычно имеет разрядность АЛУ при выполнении базовых операций(но как раз x64 здесь похоже является исключением), а типы float и double обычно соответствуют одинарной и двойной точности IEEE754.
              Сообщение отредактировано: trainer -
                Цитата trainer @
                Например, тип int обычно имеет разрядность АЛУ при выполнении базовых операций(но как раз x64 здесь похоже является исключением)

                "Исключением" является не только x64, но и, например, 16-битные режимы IA-32. Поэтому правильнее говорить, что тип int обычно имеет разрядность операнда по умолчанию для данного режима работы процессора. В 64-битном режиме x86-64 размер адреса по умолчанию равен 64 битам, а размер (целочисленного) операнда - 32 битам, и соотв-но оптимальный размер int также составляет 32 бита
                  Цитата leo @
                  "Исключением" является не только x64, но и, например, 16-битные режимы IA-32.
                  16-битный режим является наследием 8086 с 16-битным АЛУ и по сути эмулируется в 32-разрядных x86, почему Intel засунула 16-разрядные 8086/8088, 80186/80188 и 80286 в IA-32, или почему она линейке x86 дала имя IA-32 - неясно. Действительным исключением являются также 8-разрядные процессоры и микроконтроллеры.
                    Цитата 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 ес-но наоборот
                    Сообщение отредактировано: leo -
                      Ну ты еще MMX сотоварищи вспомни. Они не в АЛУ выполняются.
                      АЛУ почти пофиг с какой разрядностью конкретная команда, ибо в x86 команда транслируется в набор микрокоманд, которые и исполняются.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0619 ]   [ 16 queries used ]   [ Generated: 14.06.25, 11:56 GMT ]