使用深度嵌套的指针

时间:2010-06-25 20:56:37

标签: c performance

假设我们必须在一些函数中使用深度嵌套指针:

function (ptr_a_t ptr_a) {
    ...
    a = ptr_a->ptr_b->ptr_c->val;
    b = ptr_a->ptr_b->ptr_c->val;
    ...
}

假设所有指针都经过检查并且有效,与以下内容相比,是否存在性能下降,原子性问题或其他警告(可读性除外):

function (ptr_a_t ptr_a) {
    val = ptr_a->ptr_b->ptr_c->val;
    ...
    a = val;
    b = val;
    ...
}

更新 我用gcc -S编译了这个c文件(仅用于调查目的):

typedef struct {
  int val;
} c_str_t;

typedef struct {
  c_str_t *p_c;     
} b_str_t;

typedef struct {
  b_str_t *p_b;     
} a_str_t;

void func (a_str_t *p_a) 
{
     int a,b;

     a = p_a->p_b->p_c->val;
     b = p_a->p_b->p_c->val;

     printf("", a,b);
}

对于gcc -S:

movl    8(%ebp), %eax
movl    (%eax), %eax
movl    (%eax), %eax
movl    (%eax), %eax
movl    %eax, -4(%ebp)
movl    8(%ebp), %eax
movl    (%eax), %eax
movl    (%eax), %eax
movl    (%eax), %eax
movl    %eax, -8(%ebp) 

对于gcc -S -O1:

movl    8(%ebp), %eax
movl    (%eax), %eax
movl    (%eax), %eax
movl    (%eax), %eax
movl    %eax, 8(%esp)
movl    %eax, 4(%esp) 

我在内部结构中使用 volatile 特定器进行观察。 因此,嵌套指针被强制优化。

3 个答案:

答案 0 :(得分:3)

除非某些中间结构成员标记为 volatile ,否则编译器应将您的两个示例视为等效。我更喜欢你的第二个代码示例,因为它看起来更干净。

答案 1 :(得分:2)

我非常确定你的编译器会将这两个代码优化为与gcc相同的代码。

通过为两者生成汇编代码(在gcc中使用-S开关)并比较它们,您可以非常轻松地检查这一点。

答案 2 :(得分:2)

这些是否会被视为相同依赖于实现。以两种方式编译代码并检查程序集输出,以查看编译器如何处理这两种情况。

在我正在开发的嵌入式系统上,我添加了一个像您一样的“中间”指针,并在功能的执行时间内看到了明显的加速。就我而言,编译器每次都从头开始重新计算指针链,而不是优化它们。您的编译器可能不同,唯一真正的方法是尝试两种方式并测量执行时间。