【发布时间】:2011-09-07 07:37:12
【问题描述】:
我目前正在计算传递给函数的参数的总大小,以字节为单位。理论上,每个参数都可以写出sizeof(x)。但是,如果要为很多功能执行此操作,这将是极大的浪费时间。我正在尝试计算参数的空间量,以便分配适量的内存来存储它们并存储它们(用于各种函数,具有混合类型)。
我正在寻找一个可以确定非可变参数函数的所有参数大小的表达式,无论它们的名称如何,也不管有多少(在合理的范围内,我只支持大约 64现在的论点)。它可以是一个函数,一个预处理器宏,我不知道它的实现。我也对处理可变参数函数感兴趣,但我很确定这是不可能的,因为当您进入可变参数函数时,您已经丢失了有关数据类型的所有信息。
目前,我发现了三种可能会被扭曲以让我这样做的方法。第一个是基于Laurent Deniau's arg counting 的概念。理论上,我可以使用宏来生成函数头,并做一些类似的花哨的步骤来获取 args 的数量并分派给处理每个有 N 个参数的个别情况的各种宏。 (见:丑)。基本上,我只是使用宏为所有函数名起别名,然后在每个函数名上使用 sizeof。问题是,我需要为我想要表示的每个长度的参数创建一个宏。而且我真的不喜欢做 64 件(或更多)事情来完成一项工作。
第二种方法是尝试遵循Ben Klemer's 'better variadic' stuff的方法。我不会使用他的所有方法,但我会尝试生成一个结构,该结构将函数的 arg 签名表示为结构。然后我可以尝试获取结构元素的大小(甚至结构本身,如果我关心的只是对空间的保守估计)。这有几个问题。首先,它可能只适用于符合 C99 的东西(仍在检查中)。其次,它导致为每个实现的功能创建一个额外的结构。这并不完全是个问题,但仍然存在问题,即他制作结构的方法最终与函数具有相同的名称(因此您仍然需要引用名称才能使用它们)。不过,我可能可以解决这个问题。
第三种可能的方法是递归宏,尽管我不确定这会让编译器多么高兴。理论上可以通过调用POPPER(arg, ...) POPPER(<strong>VA_ARGS</strong>) + sizeof(arg) 形式的宏来递归地从VA_ARGS 中弹出元素。显然,当 VA_ARG 为空时需要一个停止规则(以及确保您不会被浮动 + 符号抓住的东西),但您明白了。
任何一件事情都可以让我这样做:
- 从可变参数宏中解压缩 VA_ARGS 的良好、灵活的方法。如果有任何方法可以索引它
- 一个很好的递归宏示例,可以依赖它来执行此操作(以及它在最大参数数、编译器兼容性、标准合规性等方面的限制)。
- 一种通过不同类型的函数检查直接获取所有 args 总大小的方法。 GCC 似乎有一些 crazy 函数用于构建可能适用的呼叫转发的函数调用,但这些是特定于编译器的,几乎没有文档记录,并且似乎没有报告它们分配的内存块的大小。他们还会报告大量不相关的信息。
【问题讨论】:
-
sizeof()从不浪费任何时间,因为它总是由编译器在编译时计算。它不是一个函数,而只是一个运算符。 -
我为你的准备研究喝彩,但你有一个具体的、可以回答的问题吗?
-
它可以以或多或少的 hackish 和/或系统/编译器依赖的方式完成,但是为了给你一个体面的建议,如果你能回答这个问题会很好:你打算做什么有了这些信息,什么时候需要? (在运行时,编译时还是仅仅作为源代码指标?)
-
gobject-introspection 和 libffi 是两个可能与您正在做的事情相关的库(虽然我不确定您在做什么)
-
嗯,这与我之前试图找到一个好的 C 记忆库的问题有关。由于什么都不存在,我正在尝试做一些前期工作,这将节省我为各种功能添加/删除记忆的时间。为此,我需要能够存储函数输入的签名(通过定义和分配 arg 签名结构或将数据推送到 malloc'ed 块中)。无论哪种方式,我都需要一种方法来读取任意数量的参数而不知道它们的名字。既然编程是信息游戏,信息是存在的,这应该是可能的。
标签: c macros c-preprocessor sizeof variadic-macros