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



我所做的工作对预处理器来说非常繁重。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()现在是我可以调用的东西,以便在16次迭代后将输入CRC转换为其输出。我用它来填充我的表。事实上,我制作了更多的嵌套宏来填充表,但为了简单起见,这段代码足以让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_7ITERATIONSCRC_6ITERATIONS等迭代所需的次数。最后128个字节都需要使用CRC_8ITERATIONS,这仍然很快。至少对我使用clang llvm 3.5来说是这样。

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

最新更新