【发布时间】:2019-05-09 02:52:51
【问题描述】:
我有 100 个看起来像这样的结构:
struct s00 { char data[30]; };
struct s01 { char data[30]; };
struct s02 { int data[10]; };
struct s03 { double data[5]; };
struct s04 { float data[20]; };
struct s05 { short data[15]; };
struct s06 { char data[7]; };
struct s07 { int data[19]; };
struct s08 { double data[11]; };
struct s09 { float data[5]; };
struct s10 { char data[52]; };
//...
struct s99 { char data[12]; };
typedef struct s00 s00;
typedef struct s01 s01;
typedef struct s02 s02;
//...
typedef struct s99 s99;
我想在编译时从这些结构中找到最大的sizeof。我尝试使用这样的比较宏:
#define LARGER(a, b) ((a) > (b) ? (a) : (b))
然后使用它来构造包含结果的最终定义:
#define MAX_SIZEOF (LARGER(sizeof(s00), \
LARGER(sizeof(s01), \
LARGER(sizeof(s02), \
LARGER(sizeof(s03), \
LARGER(sizeof(s04), \
LARGER(sizeof(s05), \
LARGER(sizeof(s06), \
LARGER(sizeof(s07), \
LARGER(sizeof(s08), \
LARGER(sizeof(s09), \
LARGER(sizeof(s10), \
//...
sizeof(s99))) /*...*/ ))
但是,编译器空间不足:
错误 C1060 编译器堆空间不足
这是有道理的,因为 #define 必须跟踪很多数字,因为它只是替换文本。具体来说,MAX_SIZEOF 中的整数个数是指数级的,可以描述为:
其中 x 等于所涉及的结构的数量。假设一个整数有 4 个字节,编译器需要分配 30.4 兆兆兆字节来计算这个宏(如果我的计算是正确的)。我的系统最多可以处理 17 个结构(786430 个数字,3.14 兆字节)。
我不确定如何在 C 中找到有效的解决方案。
在 C++ 中,我可以使用 constexpr 轻松实现这一点,而不会出现任何编译问题:
constexpr size_t LARGER(size_t a, size_t b) {
return a > b ? a : b;
}
constexpr size_t MAX_SIZEOF() {
return
LARGER(sizeof(s00), \
LARGER(sizeof(s01), \
LARGER(sizeof(s02), \
LARGER(sizeof(s03), \
LARGER(sizeof(s04), \
LARGER(sizeof(s05), \
LARGER(sizeof(s06), \
LARGER(sizeof(s07), \
LARGER(sizeof(s08), \
LARGER(sizeof(s09), \
LARGER(sizeof(s10), \
//...
sizeof(s99))/*...*/)));
但是,我只能在这里使用 C。 ...感谢您的任何想法!
【问题讨论】:
-
你为什么要这样做?
-
@Edition 我正在通过套接字(CSFML UDP 套接字)发送许多不同的结构。由于这些套接字接收固定大小的缓冲区,我想找到最大值,以便缓冲区不会超出范围。我通过简单地动态分配缓冲区来避免这个问题,但我现在想提高程序的性能。
-
c++如何实现constexpr,它会在编译时评估您在c中尝试的内容,而不用尖叫? -
@user2162550 好吧,我想编译器确实在评估每个三元运算符,而不是在处理层时替换文本。
-
或者更确切地说;预处理器正在评估它。
标签: c algorithm macros preprocessor