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

时间:2014-09-10 23:29:31

标签: c eclipse c-preprocessor crc

我所做的事情在预处理器上非常沉重。 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需要花半个小时来编译它。

1 个答案:

答案 0 :(得分:3)

前八次迭代只是将字节向上移动了八位。您可以在参数中执行此操作,并使用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_7ITERATIONSCRC_6ITERATIONS等进行多次迭代。最后128个字节都需要使用CRC_8ITERATIONS ,这仍然很快。至少对我来说使用clang llvm 3.5。

虽然我更喜欢运行一个单独的程序来生成一个包含表格的文件。