Примитивный тип данных в C для представления размера WORD-арки - PullRequest
1 голос
/ 22 марта 2010

Я заметил, что размер long всегда равен размеру WORD любой архитектуры процессора. Это правда для всех архитектур? Я ищу портативный способ представления переменной размера WORD в C.

Ответы [ 6 ]

3 голосов
/ 22 марта 2010

Нет. На самом деле скалярные и векторные единицы часто имеют разные размеры слов. Кроме того, есть строковые инструкции и встроенные контроллеры DMA с возможностью странных операций.

Если вы хотите быстро копировать данные, memcpy из стандартной библиотеки C платформы - обычно самая быстрая.

3 голосов
/ 22 марта 2010

C не справляется с инструкциями.В C99 вы можете скопировать любой размер struct, используя одно присваивание:

struct huge { int data[1 << 20]; };
struct huge a, b;
a = b;

С помощью умного компилятора это должно генерировать самый быстрый (однопоточный, хотя в будущем, надеюсь, многопоточный) кодчтобы выполнить копирование.

Вы можете использовать тип int_fast8_t, если вам нужен «самый быстрый» целочисленный тип, определенный поставщиком.Скорее всего, это будет соответствовать размеру слова, но это точно не гарантирует даже возможность записи одной инструкцией.

Я думаю, что лучшим вариантом будет использование по умолчанию одного типа (например, int) и использованиеПрепроцессор C для оптимизации для определенных процессоров.

2 голосов
/ 22 марта 2010

В Windows sizeof(long) равно 4, даже в 64-разрядных версиях Windows.

1 голос
/ 22 марта 2010

Все станет сложнее во встроенном мире. ASAIK, C51 - 8-битный процессор, но в Keil C для c51 длинные 4 байта. Я думаю, что это зависит от компилятора.

1 голос
/ 22 марта 2010

Я думаю, что ближайшие ответы вы получите ...

  • int и unsigned int часто (но не всегда) соответствуют ширине регистра машины.
  • есть тип, который представляет собой целое число-тот же размер-как-указатель, пишется intptr_t и доступен из stddef.h IIRC. Очевидно, это должно соответствовать ширине адреса для вашей архитектуры, хотя я не знаю, есть ли какая-либо гарантия.

Тем не менее, зачастую для архитектуры не существует единого размера слова - могут быть регистры с различной шириной (например, регистры «обычный» или MMX в Intel x86), ширина регистра часто не совпадает ширина шины, адреса и данные могут быть различной ширины и т. д.

1 голос
/ 22 марта 2010

Нет, стандарт не имеет такого типа (с максимальной пропускной способностью памяти).

Но в нем говорится, что int должен быть самым быстрым типом для процессора, выполняющего над ним операции ALU.

...