【问题标题】:Stack footprint of an array of types in CC中类型数组的堆栈占用空间
【发布时间】:2010-12-04 06:24:42
【问题描述】:

我有以下功能

void DoSomething(int start[10], int end[10])

当我调用它时

void Do(void)
{
  int start[10] = {1,2,3,4,5,6,7,8,9,0};
  int end[10] = {1,2,3,4,5,6,7,8,9,0};
  DoSomething(start,end);
}

我是在堆栈上放置两个指针(总共 8 个字节)还是两个每个大小为 40 个字节的数组?

【问题讨论】:

    标签: c arrays stack


    【解决方案1】:

    在 C 中,函数的数组参数实际上是指针,因此您将两个指针放在堆栈上,不会复制数组。

    就像DoSomething 的签名是:

    void DoSomething(int *start, int *end);
    

    【讨论】:

    • 我只是感到困惑,还是您是正确的,除了在您的情况下,DoSomething 能够进行指针运算,而在问题中却不能?
    • 其实你可以在数组参数上使用指针算法。
    【解决方案2】:

    数组衰减为 C 中的指针。您将 start 和 end 的第一个元素的地址放在堆栈上。

    【讨论】:

      【解决方案3】:

      您将数组值放入Do 中的自动存储(通常在堆栈上),但只将指向这些数组的指针作为参数传递给DoSomething。

      参数是在堆栈上传递还是作为寄存器传递取决于您环境的ABI。如果架构将参数作为寄存器传递并且调用被编译器内联并且DoSomething 不需要任何变量,则可能是DoSomething 没有使用堆栈。相反,有些架构总是在堆栈上传递参数,而有些编译器不会内联,在这种情况下,堆栈会将参数值作为数组的地址以及返回地址等其他状态。

      【讨论】:

        【解决方案4】:

        您正在传递指向被调用函数的指针。

        void DoSomething(int start[10], int end[10]) {
            int x=0, k=10;
            while (k--) x += *(start++) * *(end++);
            if (x == 285) {
                /* OK: 1*1 + 2*2 + 3*3 + ... + 9*9 is 285 */
            }
        }
        
        void Do(void) {
            int start[10] = {1,2,3,4,5,6,7,8,9,0};
            int end[10] = {1,2,3,4,5,6,7,8,9,0};
            DoSomething(start, end);
        }
        

        【讨论】:

          【解决方案5】:

          要按值传递数组,请将它们放在结构中,即(伪代码):

          struct int10 {
            int arr[ 10];
          };
          
          void DoSomething( struct int10 start, struct int10 end);
          
          void Do(void) {
            struct int10 start;
            struct int10 end;
            ...
            DoSomething( start, end);
          }
          

          【讨论】:

            猜你喜欢
            • 2015-06-22
            • 1970-01-01
            • 2010-09-10
            • 2012-06-12
            • 2019-01-18
            • 2014-11-16
            • 1970-01-01
            • 1970-01-01
            • 2017-04-20
            相关资源
            最近更新 更多