【发布时间】:2009-08-20 20:57:43
【问题描述】:
所以我通过展开一些循环来优化一些代码(是的,我知道我应该依靠我的编译器为我做这件事,但我没有使用我选择的编译器)并且我想这样做有点优雅,这样万一我的数据大小由于将来的一些编辑而发生变化,代码就会优雅地降级。
类似:
typedef struct {
uint32_t alpha;
uint32_t two;
uint32_t iii;
} Entry;
/*...*/
uint8_t * bytes = (uint8_t *) entry;
#define PROCESS_ENTRY(i) bytes[i] ^= 1; /*...etc, etc, */
#if (sizeof(Entry) == 12)
PROCESS_ENTRY( 0);PROCESS_ENTRY( 1);PROCESS_ENTRY( 2);
PROCESS_ENTRY( 3);PROCESS_ENTRY( 4);PROCESS_ENTRY( 5);
PROCESS_ENTRY( 6);PROCESS_ENTRY( 7);PROCESS_ENTRY( 8);
PROCESS_ENTRY( 9);PROCESS_ENTRY(10);PROCESS_ENTRY(11);
#else
# warning Using non-optimized code
size_t i;
for (i = 0; i < sizeof(Entry); i++)
{
PROCESS_ENTRY(i);
}
#endif
#undef PROCESS_ENTRY
这当然行不通,因为sizeof 不适用于预处理器(至少,this answer 似乎表明了这一点)。
是否有一种简单的解决方法可以让sizeof 成为与 C 宏一起使用的数据结构,或者我只是 SOL?
【问题讨论】:
-
好吧,sizeof() 是一个宏。至少是一个内置宏。
-
sizeof 不是任何形状或形式的宏
-
sizeof 不是宏,尽管 offsetof 是。 sizeof 更像是一个运算符。
-
顺便说一句,您确定展开循环是一种优化吗?您可能会减少 CPU 时间,或者您可能会强制更多缓存未命中。如果您需要代码执行得更快一点,则需要进行测量。如果您发现不需要展开,则不必经历所有这些。
-
写出来的循环看起来很简单,上限是一个常量表达式。我不怀疑 GCC 是否会优化它。
标签: c sizeof c-preprocessor