sizeof на языке D

#size #d #sizeof

#размер #d

Вопрос:

 import std.stdio;

void main() {
    int[] a = [1,2,3,4,5,6,7,8,9,10];
    write(a.sizeof);
}
  

В следующем коде sizeof статического массива равен 8 байтам. Я использую x86 Windows 8, поэтому указатель равен 4 байтам.
Почему я получаю массив размером 8 байт?

Ответ №1:

Потому что int[] это динамический массив, а не указатель. Массивы в D не являются указателями. Что они собой представляют, по сути

 struct(T)
{
    T* ptr;
    size_t length;
}
  

Итак, если вам нужен базовый указатель, вам нужно использовать ptr элемент массива, хотя обычно это требуется только при взаимодействии с кодом C / C (поскольку динамические массивы в C / C являются просто указателями). Однако length элемент используется постоянно и помогает сделать массивы в D намного более мощными и приятными для работы, чем массивы в C / C . Если вы хотите узнать больше о массивах в D, то вам следует прочитать эту статью. В нем довольно подробно рассказывается о них, и я бы счел его обязательным для прочтения всеми программистами на D .

Независимо от того, что sizeof дает вам, это размер ptr и length вместе взятых, который был бы 8 в 32-разрядных системах и 16 в 64-разрядных системах.

Комментарии:

1. Хотя я не думаю, что это требуется стандартом, интересно отметить, что в D ABI прямо сейчас динамический массив фактически сначала помещает длину в память, а затем указатель. Хотя сути того, что ты сказал, это не меняет.

2. @AdamD.Ruppe Технически, я не думаю, что существует официальный ABI для динамических массивов. Насколько я понимаю, они даже технически не должны быть реализованы с помощью ptr и length . Они могут быть реализованы в виде указателей begin и end до тех пор, пока существуют свойства ptr и length (хотя в этом случае они были бы функциями свойств). Но реально, на этом этапе они будут реализованы с помощью ptr и length членов. Возможно, на самом деле стоило бы указать это (и их порядок) в спецификации, но я не знаю, каковы компромиссы для его указания или не указания.

Ответ №2:

Динамический массив (то, что у вас есть) находится за кулисами, на самом деле это структура с указателем и size_t длиной, которые равны 4 на вашем процессоре.

Это позволяет D выполнять перенос по длине массива, чтобы избежать чтения и записи за пределы (если у вас включена проверка) и O(1) операции среза.