使用sizeof()从C ++移植代码到PHP

时间:2011-12-18 01:53:03

标签: php c++ porting sizeof struct

我有一些C ++代码(如下所示),我需要将其转换为另一种语言(即PHP)。如图所示,代码使用了PHP不能执行的结构。我知道我可以通过对象/数组来“模仿”结构,但是,这是不一样的。这不是我的主要问题。我需要一种方法来实现C ++中的sizeof()函数(因为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 个答案:

答案 0 :(得分:4)

显然,从C中重新创建sizeof将是一项艰巨的任务,因为C是静态类型的,传统上,sizeof在运行时由编译器进行评估。 PHP在内存使用方面也非常安静。

动态获取对象大小的一种方法是在分配相关对象之前和之后使用memory_get_usageofficial PHP reference)。当然,当你比较两个内存使用值时,你会遇到一些有趣的计算,因为将值存储到变量中也会分配内存。

这是一种非常不稳定的重新创建sizeof的方法,但如果它有效则可行。

答案 1 :(得分:2)

您可以简单地对数组或对象中所有对象的大小求和。但是,它仍然只获得字符串的长度等。如果你想要对象的二进制表示的实际大小,你将不得不做一些额外的数学运算,例如将所有的int转换为32位(或64)和向所有UTF-8字符串附加一个空字节。如果您正在使用字符集,请确保它们是单字节或至少可以测量的字节数。

PHP没有检查对象内存大小的函数。