繁体   English   中英

嵌套C-宏,CRC计算,Eclipse Java崩溃

[英]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_7ITERATIONSCRC_6ITERATIONS等进行所需的迭代次数。最后128个字节都需要使用CRC_8ITERATIONS ,这仍然相当快。 至少对我来说使用clang llvm 3.5。

尽管我更喜欢只运行一个单独的程序来生成一个文件,以包含其中包含表的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM