Полагаю, вы обеспокоены тем, что для вычисления L0 + L1 + L2 и т. Д. Требуется время.
Если L0, L1 и т. Д. Являются константами, и, как вы упомянули, сценарий perl генерирует код с этими значениями, любой компилятор с достойной оптимизацией будет предварительно вычислять эти значения.
Это называется постоянным распространением:
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
Сгенерированный код не вычисляет смещения каждый раз.