在不编译和执行代码的情况下找到类型大小的最简单方法是什么?

Mat*_*att 2 c bash gcc sizeof

我编写了一个bash脚本来确定gcc数据类型的大小(例如./sizeof int double输出各自的大小intdouble),方法是将每个参数包装在下面的P()宏中,然后编译并运行代码.

#define P(x) printf("sizeof(" #x ") = %u\n", (unsigned int)sizeof(x))
Run Code Online (Sandbox Code Playgroud)

问题是这是相对慢的(需要一整秒!),特别是链接步骤(因为编译-c-S几乎没有时间,运行输出的二进制文件也是如此).一秒钟本身并不是那么慢,但如果我在其他脚本中使用这个脚本,它会加起来.

是否有更快,更少的迂回方式来找出gcc数据类型使用的大小?

Bre*_*ale 6

您可以使用autoconf(请参阅: )使用的“负数组大小”技巧AC_COMPUTE_INT。这样,您就不需要链接或执行代码。因此,它在交叉编译时也有效。例如,

int n[1 - 2 * !(sizeof(double) == 8)];
Run Code Online (Sandbox Code Playgroud)

如果出现以下情况,则编译失败:sizeof(double) != 8

缺点是,您可能必须-DCHECK_SIZE=8在命令行中传递或类似的内容,因为可能需要多次传递才能检测到异常值。所以,我不确定这是否会更快-但你也许可以利用它。

编辑:如果您专门使用 gcc,我认为 @wintermute 的评论可能是最好的解决方案。

  • @Matt - 由您提供一系列值 - `AC_COMPUTE_INT` 本身实现了二分搜索以收敛到正确的值。 (2认同)

Eug*_*Sh. 5

您只能使用GCC的预处理器来实现标准类型的功能.对于标准类型,有预定义的宏:

__SIZEOF_INT__
__SIZEOF_LONG__
__SIZEOF_LONG_LONG__
__SIZEOF_SHORT__
__SIZEOF_POINTER__
__SIZEOF_FLOAT__
__SIZEOF_DOUBLE__
__SIZEOF_LONG_DOUBLE__
__SIZEOF_SIZE_T__
__SIZEOF_WCHAR_T__
__SIZEOF_WINT_T__
__SIZEOF_PTRDIFF_T__
Run Code Online (Sandbox Code Playgroud)

因此,通过使用如下代码:

#define TYPE_TO_CHECK __SIZEOF_INT__
#define VAL_TO_STRING(x) #x
#define V_TO_S(x) VAL_TO_STRING(x)
#pragma message V_TO_S(TYPE_TO_CHECK)
#error "terminate"
Run Code Online (Sandbox Code Playgroud)

__SIZEOF_INT__甚至无需启动编译就可以从预处理器本身获取值.在您的脚本中,您可以定义TYPE_TO_CHECK(with -D)到您需要的任何内容并将其传递给gcc.当然你会得到一些垃圾输出,但我相信你可以解决这个问题.

  • 我喜欢这个主意,虽然你可以做`echo __SIZEOF_INT__ | cpp | 尾巴-1` (4认同)
  • @Wintermute"cpp"不保证与gcc使用的预处理器相同...在某些系统上它不是,并且可能会产生不同的结果.您可能需要"gcc -E - "来代替"cpp" (4认同)
  • @EugeneSh.:可能只是因为你对填充的影响感到好奇,不是吗?也许你想估算一些算法的内存消耗?谁知道. (3认同)
  • 这将无法计算任意结构的大小 (2认同)
  • 哟可以做到,实际上并没有那么复杂.`sizeof`是一个编译时运算符,所以如果你把你的文件放在`volatile const s = sizeof(struct arbStruct); `,在汇编文件中,你会得到类似的东西:`_s:.long 16` (2认同)
  • 但是存在一个危险,即您的程序将在具有完全不同的汇编指令的平台上运行,因此该逻辑将变为无效. (2认同)