我有一些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);
}
任何人都可以指出我正确的方向如何做到这一点?
任何帮助都将不胜感激。
答案 0 :(得分:4)
显然,从C中重新创建sizeof
将是一项艰巨的任务,因为C是静态类型的,传统上,sizeof
在运行时由编译器进行评估。 PHP在内存使用方面也非常安静。
动态获取对象大小的一种方法是在分配相关对象之前和之后使用memory_get_usage
(official PHP reference)。当然,当你比较两个内存使用值时,你会遇到一些有趣的计算,因为将值存储到变量中也会分配内存。
这是一种非常不稳定的重新创建sizeof
的方法,但如果它有效则可行。
答案 1 :(得分:2)
您可以简单地对数组或对象中所有对象的大小求和。但是,它仍然只获得字符串的长度等。如果你想要对象的二进制表示的实际大小,你将不得不做一些额外的数学运算,例如将所有的int转换为32位(或64)和向所有UTF-8字符串附加一个空字节。如果您正在使用字符集,请确保它们是单字节或至少可以测量的字节数。
PHP没有检查对象内存大小的函数。