将指针传递给函数而不复制它

时间:2014-01-23 12:52:54

标签: c++ pointers stl

如何在不复制每次程序的情况下传递数据?

具体来说,当调用sim(ohlc)我想传递指针引用时,我不想将数据复制到函数中。

这是我制作的程序,但我不确定这是最好的方法(特别是在速度和内存使用方面)。

我想我没有像我应该那样将指针传递给sim(ohlc),但如果我尝试sim(&ohlc)我不知道如何更改sim函数来接受它。

   struct ohlcS {
        vector<unsigned int> timestamp;
        vector<float> open;
        vector<float> high;
        vector<float> low;
        vector<float> close;
        vector<float> volume;
    } ;


ohlcS *read_csv(string file_name) {
    // open file and read stuff
    if (read_error)
        return NULL;
    static ohlcS ohlc;
    ohlc.timestamp.push_back(read_value);
    return &ohlc;
}

int sim(ohlcS* ohlc) {
    // do stuff
    return 1;
}


main() {
    ohlcS *ohlc = read_csv(input_file);
    results = sim(ohlc);
}

3 个答案:

答案 0 :(得分:2)

这是C ++,使用引用。这是安全的,因为你返回一个静态对象。

static ohlc ohlc_not_found;

ohlc &read_csv(string file_name) {
    // open file and read stuff
    if(error_while_opening)
    {
        return ohlc_not_found;
    }
    static ohlc loc_ohlc;
    loc_ohlc.timestamp.push_back(read_value);
    return loc_ohlc;
}

int sim(const ohlc& par_ohlc) {
    // do stuff
    return 1;
}

....
 ohlc& var_ohlc = read_csv(input_file);
 if(var_ohlc == ohlc_not_found)
 {
      // error handling
      return;
 }
 results = sim(var_ohlc);

如果你想在sim中修改par_ohlc,不要把它变为常量。

并且不建议对类和变量名使用ohlc :(

答案 1 :(得分:1)

排队:

results = sim(ohlc);

您正在将ohlc指针传递给sim函数,没有进行深度数据复制,只复制了32位指针值。

答案 2 :(得分:1)

这会将地址(32位值)压入堆栈。

results = sim(ohlc);

像:

  ; ...
  push eax ; addr of struct/class/whatever
  call function ; jump to function

  ; ...

function:
  push ebp
  mov ebp, esp
  mov eax, [ebp+8] ; ebp+8 is the 32 bit value you pushed before onto the stack
                   ; -> your pointer

看看at this,也许that

第2版

  ; ...
  push eax ; addr of struct/class/whatever
  jmp function ; jump to function
autolbl001:

  ; ...

function:
  push ebp
  mov ebp, esp
  mov eax, [ebp+8] ; ebp+8 is the 32 bit value you pushed before onto the stack
  ; ...
  jmp autolbl001