有人可以解釋以下兩個代碼片段之間的區別嗎?在下面的函式中,*frame_id可能是 a nullptr,它基本上是函式中的輸出引數。
bool LRUReplacer::Victim(frame_id_t *frame_id) {
long oldest_ts = std::numeric_limits<long>::max();
for (auto & it : this->LRUCache){
if (it.ts < oldest_ts){
oldest_timestamp = it.ts;
*frame_id = it.frame_id;
}
}
對比
bool LRUReplacer::Victim(frame_id_t *frame_id) {
long oldest_ts = std::numeric_limits<long>::max();
for (auto & it : this->LRUCache){
if (it.ts < oldest_ts){
oldest_timestamp = it.ts;
frame_id = &it.frame_id;
}
}
在第一種情況下,我們分配frame_id 的值it.frame_id和在第二種情況下,我們分配指標的地址it.frame_id?
uj5u.com熱心網友回復:
讓我們考慮一個與讀/寫/解參考基本相同的簡化示例:
void f1(int* value)
{
*value = 1;
}
int g_value = 1;
void f2(int* value)
{
value = &g_value;
}
int main()
{
{
int value = 2;
f1(&value);
std::cout << value << '\n'; // prints 1
}
{
int value = 2;
f2(&value);
std::cout << value << '\n'; // prints 2
}
}
請注意,您只需在第二種選擇中重新分配引數。該引數是一個按值傳遞的指標值,因此對呼叫者傳遞的指標指向的變數絕對沒有影響。
在 C 中,最好使用參考:
void f3(int& value)
{
value = 1;
}
int main()
{
int value = 2;
f3(value);
std::cout << value << '\n'; // prints 1
}
uj5u.com熱心網友回復:
第一個是用新值替換指向frame_id的值。第二個是嘗試替換給定的指標,使其指向別的東西。但它不會起作用。
您將獲得堆疊上的指標并重置它。這不會傳回給呼叫者。他會被他傳遞給你的價值所困。除非你通過參考傳遞它
如果您希望第二個作業,您需要將簽名更改為:
bool LRUReplacer::Victim(frame_id_t*& frame_id) {
uj5u.com熱心網友回復:
在第一個回圈中,如果it.ts < oldest_ts將值分配給it.frame_id指向frame_id_t哪些frame_id點。回圈完成后,frame_id_t實體 ( *frame_id) 將保存分配給它的最后一個值。
在第二個回圈中,您將改為將地址分配給it.frame_id( frame_id_t*) frame_id。回圈完成后,frame_id將指向it.frame_id它設定為指向的最后一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454257.html
