#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)
операции среза.