powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Compile-time способ определения размера статического массива в количестве элементов.
11 сообщений из 36, страница 2 из 2
Compile-time способ определения размера статического массива в количестве элементов.
    #38071364
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПовторяю: размер адреса не обязан совпадать с размером регистра. Считать одним целым регистром быстрее чем половинкой или двумя регистрами, верно? Поэтому использовать тип данных близкий к размеру регистра в качестве счетчиков лучше чем тип данных совпадающий с размером адреса.

Хорош уже фантазировать.
На всех распространенных платформах размер size_t совпадает с размером регистров.
И при этом как минимум на одной из самых распространенных - x86_64 - размер int не совпадает ни с регистрами ни с адресами.
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38071846
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Anatoly Moskovsky:
Anatoly MoskovskyПо стандарту гарантируется что size_t вмещает любой адрес на данной платформе.
Разве? Не путаете с intptr_t/uintptr_t? Просто в 16-битных DOS/Windows было:
near-указатели -- 16-битные
far-указатели -- 32-битные
size_t -- 16-битный
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38071849
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седовfar-указатели -- 32-битные
size_t -- 16-битный
Объявление FAR-указателя это нестандартное расширение.
Поэтому бессмыслено рассматривать взаимосвязь size_t и FAR-указателей.
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38071851
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насчет того intptr_t или size_t пригодны для хранения указателей, то по стандарту это конечно intptr_t.
А равенство размеров size_t и intptr_t явно не прописано, но легко выводится.
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38071852
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Anatoly Moskovsky:
Если при компиляции 16-битной программы указать memory model = large, то все указатели по умолчанию -- far, без всяких нестандартных расширений языка. В такой, вполне себе стандартной, конфигурации:
указатели -- 32-битные
size_t -- 16-битный
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38071863
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,

Ну ок. Осталось теперь найти компилятор, который одновременно предоставляет intptr_t и far указатели проверить вмещает ли intptr_t эти указатели :)
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38072538
А есть какое-то отличие intptr_t от void *?
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38072619
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отличие intptr_t от void *А есть какое-то отличие intptr_t от void *?
По стандарту в intptr_t можно сохранять и получать обратно без потерь любые указатели на объекты или void.
Но внутри оно необязательно хранится также как и указатель.
Хотя на практике они побитово равны :)
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38072679
Anatoly Moskovskyотличие intptr_t от void *А есть какое-то отличие intptr_t от void *?
По стандарту в intptr_t можно сохранять и получать обратно без потерь любые указатели на объекты или void.
Не совсем понятно тогда зачем он нужен и чем он лучше чем void * и если он может указывать на любые объекты то зачем ещё ввели uintptr_t?
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38072730
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
intptr_t, uintptr_t и void *Не совсем понятно тогда зачем он нужен

Затем, что иногда приходится писать грязный код, укладывающий указатели в целые и
наоборот. А эти типы - просто переносимый способ выбрать целое, в которое можно безопасно
уложить указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Compile-time способ определения размера статического массива в количестве элементов.
    #38076925
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
intptr_t, uintptr_t и void *Anatoly Moskovskyпропущено...

По стандарту в intptr_t можно сохранять и получать обратно без потерь любые указатели на объекты или void.
Не совсем понятно тогда зачем он нужен и чем он лучше чем void * и если он может указывать на любые объекты то зачем ещё ввели uintptr_t?
Dimitry Sibiryakov уже написал зачем, а я приведу конкретный пример. Скажем, есть такая структура:
Код: plaintext
1.
2.
3.
4.
struct Node1 {
  Node1* next;
  bool value;
};


Из-за выравнивания она занимает 8 байт (на 32-битной платформе). Но эту структуру можно «ужать» с помощью следующего трюка. Экземпляры Node1 должны располагаться в памяти выровнено, обычно на 4 байта. Поэтому младший бит указателя на Node1 всегда равен нулю. Этот бит можно использовать для хранения value. Чтобы сделать это максимально переносимо (= кросс-платформенно), нам как раз и понадобится тип uintptr_t:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
#include <stdint.h> // для uintptr_t (это не встроенный тип, а typedef)

struct Node2 {
  // в младшем бите храним value, в остальных битах -- next
  uintptr_t data;

  void pack(Node2* next, bool value) {
    uintptr_t n = reinterpret_cast<uintptr_t>(next);
    assert((n & 0x1) == 0); // младший бит должен быть 0
    data = n | static_cast<uintptr_t>(value);
  }

  Node2* unpack_next() const {
    uintptr_t n = data & ~static_cast<uintptr_t>(0x1); // обнуляем младший бит
    return reinterpret_cast<Node2*>(n);
  }

  bool unpack_value() const {
    return static_cast<bool>(data & 0x1); // выделяем младший бит
  }
};

void test_node_2() {
  Node2 a, b;
  a.pack(&b, true);
  assert(a.unpack_next() == &b);
  assert(a.unpack_value() == true);
}


Такая структура занимает уже 4 байта. Плата за это -- усложнение кода и усложнение отладки (теперь в отладчике просто так не посмотришь значение поля next).

У типа uintptr_t есть WinAPI-шный аналог -- UINT_PTR.

А зачем ввели ещё знаковый intptr_t (и WinAPI-шный INT_PTR) -- не понимаю, по-моему одного uintptr_t вполне достаточно.
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Compile-time способ определения размера статического массива в количестве элементов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]