[英]Nesting C-Macros, CRC calculation, Eclipse Java crash
我所做的工作在预处理器上非常繁重。 MinGW需要一两分钟的时间来编译它,但是它确实通过了单元测试。 Eclipse处于挣扎状态,并弹出Java堆不足的消息,或者最终溢出。 我的问题是有没有办法使预处理器更容易? 我要增加我的Java堆吗? 还是有更好的方法在编译时填充表
这里是:
我已经创建了一个CRC查找表,并决定在编译时填充它(关键字:编译时),并且不想对任何数字进行硬编码。 所以我想出了一个宏来计算CRC,只对多项式进行硬编码。 (也许有点难以阅读,但是它通过了单元测试)
// Define CRC polynomial
#define POLYNOMIAL (0x8005)
#define CRC_1ITERATION(crc) ( \
(((crc)&0x7FFF)<<1)^( ((crc)&0x8000)?POLYNOMIAL:0 ) )
然后将其传播到16个迭代中...对该宏的重新调用深度为16个迭代!
// Iterate the CRC polynomial
#define CRC_2ITERATIONS(crc) CRC_1ITERATION( CRC_1ITERATION(crc) )
#define CRC_4ITERATIONS(crc) CRC_2ITERATIONS( CRC_2ITERATIONS(crc))
#define CRC_8ITERATIONS(crc) CRC_4ITERATIONS( CRC_4ITERATIONS(crc))
#define CRC_16ITERATIONS(crc) CRC_8ITERATIONS( CRC_8ITERATIONS(crc))
我现在可以调用CRC_16ITERATIONS()
将输入的CRC转换为16次迭代后再输出。 我用它来填充我的桌子。 实际上,我制作了更多的嵌套宏来填充表,但是为了使事情简单,此代码足以使Eclipse挣扎:
// Populate the table (EDIT: corrected spelling)
CRC_16ITERATIONS(0), CRC_16ITERATIONS(1), CRC_16ITERATIONS(2), CRC_16ITERATIONS(3),
CRC_16ITERATIONS(4), CRC_16ITERATIONS(5), CRC_16ITERATIONS(6), CRC_16ITERATIONS(7),
CRC_16ITERATIONS(8), CRC_16ITERATIONS(9), CRC_16ITERATIONS(10), CRC_16ITERATIONS(11),
CRC_16ITERATIONS(12), CRC_16ITERATIONS(13), CRC_16ITERATIONS(14), CRC_16ITERATIONS(15)
它在MinGW中起作用,包括通过单元测试,但是就像我说的那样,我认为我在Java / Eclipse中使用了某些括号或宏扩展堆栈。 我希望将其扩展到256个条目表,但我怀疑MinGW将花费半小时来编译它。
前八次迭代只是将字节上移了八个位。 您可以在参数中执行此操作,并使用CRC_8ITERATIONS
而不是CRC_16ITERATIONS
(顺便说一句,您多次将其CRC_16ITERATION
拼写错误)。
即:
CRC_8ITERATIONS(0), CRC_8ITERATIONS(1 << 8), CRC_8ITERATIONS(2 << 8), CRC_8ITERATIONS(3 << 8),
CRC_8ITERATIONS(4 << 8), CRC_8ITERATIONS(5 << 8), CRC_8ITERATIONS(6 << 8), CRC_8ITERATIONS(7 << 8),
CRC_8ITERATIONS(8 << 8), CRC_8ITERATIONS(9 << 8), CRC_8ITERATIONS(10 << 8), CRC_8ITERATIONS(11 << 8),
CRC_8ITERATIONS(12 << 8), CRC_8ITERATIONS(13 << 8), CRC_8ITERATIONS(14 << 8), CRC_8ITERATIONS(15 << 8)
对我来说,编译速度比使用CRC_16ITERATIONS
快256倍。
对于该特定集合,我可以通过以下方式更快地进行:首先将顶部的四个零向上移,并使用CRC_4ITERATIONS
。 即:
CRC_4ITERATIONS(0), CRC_4ITERATIONS(1 << 12), CRC_4ITERATIONS(2 << 12), CRC_4ITERATIONS(3 << 12),
CRC_4ITERATIONS(4 << 12), CRC_4ITERATIONS(5 << 12), CRC_4ITERATIONS(6 << 12), CRC_4ITERATIONS(7 << 12),
CRC_4ITERATIONS(8 << 12), CRC_4ITERATIONS(9 << 12), CRC_4ITERATIONS(10 << 12), CRC_4ITERATIONS(11 << 12),
CRC_4ITERATIONS(12 << 12), CRC_4ITERATIONS(13 << 12), CRC_4ITERATIONS(14 << 12), CRC_4ITERATIONS(15 << 12)
对于我来说,编译时间太快了。
我可以更进一步,添加CRC_3ITERATIONS
,然后执行以下操作:
0, CRC_1ITERATION(1 << 15), CRC_2ITERATIONS(2 << 14), CRC_2ITERATIONS(3 << 14),
CRC_3ITERATIONS(4 << 13), CRC_3ITERATIONS(5 << 13), CRC_3ITERATIONS(6 << 13), CRC_3ITERATIONS(7 << 13),
CRC_4ITERATIONS(8 << 12), CRC_4ITERATIONS(9 << 12), CRC_4ITERATIONS(10 << 12), CRC_4ITERATIONS(11 << 12),
CRC_4ITERATIONS(12 << 12), CRC_4ITERATIONS(13 << 12), CRC_4ITERATIONS(14 << 12), CRC_4ITERATIONS(15 << 12)
您可以在前128个字节上使用此技巧, CRC_6ITERATIONS
CRC_7ITERATIONS
, CRC_6ITERATIONS
等进行所需的迭代次数。最后128个字节都需要使用CRC_8ITERATIONS
,这仍然相当快。 至少对我来说使用clang llvm 3.5。
尽管我更喜欢只运行一个单独的程序来生成一个文件,以包含其中包含表的文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.