代码之家  ›  专栏  ›  技术社区  ›  pmod

使用深度嵌套指针

  •  2
  • pmod  · 技术社区  · 14 年前

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

    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) 
    

    我观察到的使用 不稳定的 结构内部的规范。 因此,嵌套指针被强制优化。

    3 回复  |  直到 14 年前
        1
  •  2
  •   bta    14 年前

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

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

        2
  •  3
  •   Karmastan    14 年前

    除非某些中间结构成员已标记 不稳定的 , the compiler should treat your two examples as equivalent. I would prefer your second code sample just because it looks cleaner.

        3
  •  2
  •   Remo.D    14 年前

    I'm pretty sure your compiler will optimize the two to the same code as gcc does.

    您可以很容易地通过为这两者生成汇编程序代码(在gcc中使用-s开关)并比较它们来检查这一点。