Портирование кода с помощью sizeof () из C ++ в PHP - PullRequest
0 голосов
/ 18 декабря 2011

У меня есть некоторый код C ++ (сегмент показан ниже), мне нужно преобразовать его в другой язык (а именно в PHP). Код, как видно, использует структуры, а PHP этого не делает. Я знаю, что могу «подражать» структурам через объекты / массивы, но это не то же самое. Это не моя главная проблема, хотя. Мне нужен способ реализовать функцию sizeof(), найденную в C ++ (поскольку функция PHP sizeof() просто считает количество элементов в массиве / объекте).

typedef unsigned long Offset;
typedef unsigned long Size;

struct Location {
    Offset offset;
    Size size;
};

struct Header {
    unsigned long magic;
    unsigned long version;
    struct Location elements;
    struct Location ids;
    struct Location strings;
    struct Location integers;
    struct Location decimals;
    struct Location files;
};
int Build() {
    Header theheader;
    theheader.magic = *((unsigned long*)"P3TF");
    theheader.version = 272;
    theheader.elements.offset = sizeof(theheader);
    theheader.elements.size = element_offset;
    theheader.ids.offset = ((theheader.elements.offset + theheader.elements.size + 15) / 16) * 16;
    theheader.ids.size = ids_offset;
    theheader.strings.offset = ((theheader.ids.offset + theheader.ids.size + 15) / 16) * 16;
    theheader.strings.size = string_offset;
    theheader.integers.offset = ((theheader.strings.offset + theheader.strings.size + 15) / 16) * 16;
    theheader.integers.size = 0;
    theheader.decimals.offset = ((theheader.integers.offset + theheader.integers.size + 15) / 16) * 16;
    theheader.decimals.size = 0;
    theheader.files.offset = ((theheader.decimals.offset + theheader.decimals.size + 15) / 16) * 16;
    theheader.files.size = file_offset;
    theheader.padding[0] = 0;
    theheader.padding[1] = 0;
    fwrite(&theheader, 1, sizeof(theheader), file_handle);
}

Может кто-нибудь указать мне правильное направление, как это сделать?

Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 18 декабря 2011

Очевидно, что воссоздание sizeof из C будет трудным делом, так как C статически типизирован и, как правило, sizeof оценивается компилятором во время выполнения.PHP также довольно тихо говорит об использовании памяти.

Один из способов динамического определения размера объекта - использовать memory_get_usage ( официальная ссылка PHP ) до и после выделенияобъект в вопросе.Конечно, вы столкнетесь с некоторыми забавными вычислениями, когда сравните два значения использования памяти, так как хранение значений в переменных также выделит память.если это работает, это работает.

2 голосов
/ 18 декабря 2011

Вы можете просто суммировать все размеры объектов в массиве или объекте.Тем не менее, он по-прежнему получает только длину строк и т. Д. Если вы хотите фактический размер двоичного представления объекта, вам придется выполнить некоторые дополнительные математические операции, такие как преобразование всех целых чисел в 32 бита (или 64) идобавление нулевого байта ко всем строкам UTF-8.Если вы используете наборы символов, убедитесь, что они являются однобайтовыми или, по крайней мере, измеряемыми в байтах.

PHP не имеет функции, которая проверяет объем памяти объекта.

...