在C中有效地初始化结构内部的指针

时间:2011-12-19 22:26:47

标签: c arrays pointers initialization structure

如何有效地初始化以下数据结构(无需花费任何计算)?它由一组 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

2 个答案:

答案 0 :(得分:1)

假设FieldArray具有静态存储持续时间且L0Ln是整数常量表达式,您可以这样做:

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

生成的代码每次计算偏移量。