itsnotmyrealname и RICi прикосновение аппаратных драйверов для этого, но я думал, что это может помочь пройти через простейший возможный сценарий, ведущий к различным размерам стрелочных ...
Представьте, что процессор может адресовать 32-битные слова памяти и что тип C++ int
также должен быть 32 бита в ширину.
Этот гипотетический процессор адресует определенные слова, используя нумерацию: 0 для первого слова (байты 0-3), 1 для второго (байты 4-7) и так далее. Поэтому int*{0}
ваше первое слово в памяти (при условии отсутствия странных nullptr
махинаций не требуют иного), int*{1}
второй и т.д ..
Что должен компилятор сделать, чтобы поддержать 8-битных char
типов? Может понадобиться реализовать поддержку char*
с помощью int*
, чтобы идентифицировать слово в памяти, но для хранения 0, 1, 2 или 3 нужно еще два бита, чтобы указать, к какому из байтов в этом слове указывается. Это эффективно необходимо будет генерировать машинный код, сколько программа C++ может при использовании ...
struct __char_ptr
{
unsigned* p_;
unsigned byte_ : 2;
char get() const { return (*p_ & (0xFF << (8*byte_)) >> 8*byte_; }
void set(char c) { *p_ &= ~(0xFF << (8*byte_)); *p |= c << 8*byte_; }
};
В такой системе - sizeof(__char_ptr) > sizeof(int*)
. Гибкость C++ Standard позволяет выполнять совместимые реализации C++ для (и переносимости кода в/из) странных систем с помощью этих или подобных проблем.
Что * не * вы понимаете об этом? – EJP
@EJP: Разве они не должны быть такими же? –
@Nan: Вы можете объяснить, что заставляет вас думать, что они будут? Это поможет нам понять, какое заблуждение ведет вас к такому выводу. – icktoofay