Массив отдельных битов в Аде?

Если бы я написал

type u1 is range 0 .. 1;
type Index is range 0 .. 499999;
type U1Array is array(Index) of u1;

Могу ли я предположить, что это будет битовый вектор, который эффективно упаковывает отдельные экземпляры u1? Т.е. 8 бит/байт?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Лучше проверить, чем предполагать. Проверить представление типа данных можно с помощью -gnatR2 (см. здесь). Быстрая проверка ниже показывает, что U1Array не будет битовым вектором. Размер его компонентов составит 8 [бит], общий размер — 4 000 000 [бит].

Чтобы иметь его как битовый вектор, вам нужно сделать его «упакованным» массивом (см. RM 13.2). Размер упакованного массива составит 500 000 [бит]. Размер его компонентов будет равен 1 [бит].

foo.ads

package Foo is

   type u1 is range 0 .. 1;
   type Index is range 0 .. 499999;
   
   type U1Array is array(Index) of u1;
   type U1PackedArray is array(Index) of u1 with Pack;   

end Foo;

выход

$ gcc -c foo.ads -gnatR2

Representation information for unit Foo (spec)
----------------------------------------------

for U1'Object_Size use 8;
for U1'Value_Size use 1;
for U1'Alignment use 1;

for Index'Object_Size use 32;
for Index'Value_Size use 19;
for Index'Alignment use 4;

for U1array'Size use 4000000;
for U1array'Alignment use 1;
for U1array'Component_Size use 8;

for U1packedarray'Size use 500000;
for U1packedarray'Alignment use 1;
for U1packedarray'Component_Size use 1;

Также, вероятно, хорошей идеей будет либо поместить аспект размера в U1, либо аспект Component_Size в U1PackedArray.

Jere 07.07.2024 21:53

Поскольку U1 является целочисленным типом со знаком (определенным с помощью range), его базовый тип U1'Base будет примерно симметричен относительно нуля, включая как минимум диапазон -1 .. 1. В большинстве систем будет выбран подходящий тип оборудования, обычно один байт, -128 .. 127 или эквивалент Interfaces.Integer_8. Этот базовый тип, скорее всего, будет использоваться для представления компонентов типа U1 при отсутствии каких-либо предложений представления.

Когда вам нужны конкретные представления в Аде, следует сказать так:

type U1 is mod 2 with Size => 1;
type U1array is array (Index) of U1 with Component_Size => U1'Size, Size => Index'Last + 1;

Затем компилятор будет использовать один бит для каждого значения массива, упакованного до битового уровня.

Обратите внимание, что аспект Pack — это всего лишь подсказка компилятора; компилятор может игнорировать это или упаковывать вещи менее полно, чем это возможно. С другой стороны, Size и Component_Size должны соблюдаться полностью или отвергаться, если компилятор не может этого сделать.

Верно! Мой 0 .. 1 мог ввести меня в заблуждение, заставив думать, что на самом деле я определяю один битовый тип. Позже я подумал, что mod 2 будет делать то же самое, но просто решил, что это вопрос предпочтений. Как вы заметили, это может быть не так. Очень ценный ответ!

BitTickler 08.07.2024 13:59

Другие вопросы по теме