如何有效地初始化以下数据结构(无需花费任何计算)?它由一组 struct Register
组成。每个 struct Register
的FieldArrayPointer指向的数组的长度将是不同的。我将如何提取指针(使用编译器指令?)并使用它来初始化 struct Register
数组?是否有任何替代方法来创建这样的数据结构(我不想使用链表)?
(N可以任意大)
struct Field
{
char High;
char Low;
char Attribute;
} FieldArray[L0+L1+L2...+L(N-1)];
struct Register
{
unsigned int ResetValue;
unsigned int FieldArrayLength;
struct Field *FieldArrayPointer;
} RegisterArray[N] =
{ ResetValue0, L0, <Pointer of FieldArray[0].Field>,
ResetValue1, L1, <Pointer of FieldArray[L0].Field>,
ResetValue2, L2, <Pointer of FieldArray[L0+L1].Field>,
. . . . . . . . . . . . . . . . . . . . . . . . . . . . ,
ResetValue(N-1), L(N-1),<Pointer of FieldArray[L0+L1+..+L(N-2)].Field>
};
//L0,L1,L2.. and N are constant integers
答案 0 :(得分:1)
假设FieldArray
具有静态存储持续时间且L0
到Ln
是整数常量表达式,您可以这样做:
struct Register
{
unsigned int ResetValue;
unsigned int FieldArrayLength;
struct Field *FieldArrayPointer;
} RegisterArray[N] =
{
{ ResetValue0, L0, FieldArray + 0 },
{ ResetValue1, L1, FieldArray + L0 },
{ ResetValue2, L2, FieldArray + L0 + L1 },
...
};
如果用手写出来太麻烦,你可以编写一个代码生成器来创建源代码并#include
结果。
答案 1 :(得分:1)
我假设您担心L0 + L1 + L2等的计算需要时间。
如果L0,L1等是常量,并且像你提到的那样,perl脚本会生成带有这些值的代码,任何正常的优化编译器都会预先计算这些值。
它被称为Constant Propagation: http://en.wikipedia.org/wiki/Constant_folding
gcc可以做到这一点,例如:
这是我写的一段代码:
char fubar[100];
struct bar
{
char *ptr;
int length;
} array[3] =
{
{fubar, 10},
{fubar+10, 20},
{fubar+10+20, 70}
};
这是'gcc -O2'生成的内容:
.globl array
.data
.align 4
.type array, @object
.size array, 24
array:
.long fubar
.long 10
.long fubar+10
.long 20
.long fubar+30
.long 70
.comm fubar,100,32
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
生成的代码不每次计算偏移量。