如何在不复制每次程序的情况下传递数据?
具体来说,当调用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);
}
答案 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
第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