我所做的事情在预处理器上非常沉重。 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需要花半个小时来编译它。
答案 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_7ITERATIONS
,CRC_6ITERATIONS
等进行多次迭代。最后128个字节都需要使用CRC_8ITERATIONS
,这仍然很快。至少对我来说使用clang llvm 3.5。
虽然我更喜欢运行一个单独的程序来生成一个包含表格的文件。