我目前正在寻找以字节为单位计算传递给函数的参数的总大小。理论上,一个人可以写出sizeof(x)
每一个论点。但是,如果要为很多功能执行此操作,这将是极大的浪费时间。我试图找出参数的空间量,以便我可以分配适量的内存来存储它们并存储它们(用于各种函数,具有混合类型)。
我正在寻找一个表达式,可以确定非可变参数函数的所有参数的大小,无论它们的名称如何,也不管有多少(在合理的范围内,我现在只支持大约 64 个参数很好)。它可以是一个函数,一个预处理器宏,我不知道它的实现。我也对处理可变参数函数感兴趣,但我很确定这是不可能的,因为当你进入可变参数函数时,你已经丢失了有关数据类型的所有信息。
目前,我发现了三种可能会被扭曲让我这样做的方法。第一个是基于Laurent Deniau 的 arg 计数的概念。理论上,我可以使用宏来生成函数头,并做一些类似的花哨的步骤来获取 args 的数量并分派给处理每个有 N 个参数的个别情况的各种宏。(见:丑)。基本上,我只是使用宏给所有函数名起别名,然后在每个函数名上使用 sizeof。问题是,我需要为我想要表示的每个长度的参数创建一个宏。而且我真的不喜欢做 64 件(或更多)事情来完成一项工作。
第二种方法是尝试遵循Ben Klemer 的“更好的可变参数”的方法。我不会使用他的所有方法,但我会尝试生成一个结构,该结构将函数的 arg 签名表示为结构。然后我可以尝试获取结构元素的大小(甚至结构本身,如果我关心的只是对空间的保守估计)。这有几个问题。首先,它可能只适用于符合 C99 的东西(仍在检查中)。其次,它导致为每个实现的功能创建一个额外的结构。这不完全是个问题,但仍然存在问题,即他制作结构的方法最终与函数的名称相同(因此您仍然需要引用名称才能使用它们)。
第三种可能的方法是递归宏,尽管我不确定编译器有多高兴。理论上可以通过调用形式为 的宏递归地从VA_ARGS中弹出元素。显然,当VA_ARG为空时需要一个暂停规则(以及确保您不会被浮动 + 符号抓住的东西),但您明白了。POPPER(arg, ...) POPPER(VA_ARGS) + sizeof(arg)
这些事情中的任何一件都可以让我这样做:
- 从可变参数宏中解压缩VA_ARGS的良好、灵活的方法。如果有任何方法可以索引它
- 可以依赖递归宏的一个很好的例子(以及它在最大参数数量、编译器兼容性、标准合规性等方面的限制)。
- 一种通过不同类型的函数检查直接获取所有 args 总大小的方法。GCC 似乎有一些疯狂的函数来构建可能适用的呼叫转发的函数调用,但这些是特定于编译器的,几乎没有文档记录,并且似乎没有报告它们分配的内存块的大小。他们还报告了大量不相关的信息。