簡體   English   中英

此結構的生命周期和內存設置

[英]Lifetime and memory setup of this struct

以以下形式給出結構(在main()之前或之后聲明)

struct
{
    ...
} bar;

我不知道該如何管理以及如何處理此類對象。

總的來說,我想對此做個360°的回答,但我也有幾個問題:

  • 這是否等於聲明static結構?
  • 在C ++ 11中合法和安全嗎?
  • 如何通過引用訪問欄?

對於最后一個,我在這里准備了一個小片段,該片段不起作用,但顯示了我要實現的目標。

它是未命名結構的全局對象。 您不能將此類型用作函數的參數(因為您不知道對象的真實類型)。 您可以為此使用decltype,但由於它是全局對象,因此不需要。 這是合法和安全的。

#include <iostream>

struct
{
    double k1 =  0.123;
} bar;

int foo(decltype(bar)& a)
{
    return a.k1-1;
};

int main()
{
    std::cout << foo(bar) << std::endl;
    return(0);
}

確實,由於您只有此結構的一個全局對象-您只需使用

#include <iostream>

struct
{
    double k1 =  0.123;
} bar;

int foo()
{
    return bar.k1-1;
};

int main()
{
    std::cout << foo() << std::endl;
    return(0);
}

這只是一個全局變量 您可以從此編譯單元中的任何函數或方法訪問它。 聲明它的正確方法(關於您的代碼段)將是:

struct foo
{
    double k = 1.23;
};

foo bar;

現在,您可以像這樣簡單地通過引用傳遞它:

void f(foo & b)
{
    b.k = 34.5;
}

在您的代碼段中,bar是類型為未命名結構的變量:

struct <unnamed>
{
    double k = 1.23;
} bar;

由於您沒有為類型指定任何名稱,因此無法以經典方式將其作為參數傳遞給函數。 C ++ 11允許您使用decltype指令執行此操作:

struct
{
    double k = 1.23;
} bar;

void f(decltype(bar) & b)
{
    b.k = 3.45;
}

至於您的問題:

  • 它與靜態結構不同。 靜態變量的行為略有不同。 靜態類(=結構)也是如此。

  • 在C ++ 11中使用全局變量合法且安全的,但強烈建議不要使用它們,因為它們很容易破壞程序的邏輯或體系結構。 相反,應該使用靜態類或單例。

static是存儲屬性。 struct與任何其他數據類型一樣:它可以是staticvolatileautoextern and其他由某些實現定義的類型。

這是合法和安全的。

引用這樣的結構:

struct {
     int   field1, field2;
     double  yada, yada2, yada3;
} bar1, bar2;

bar1.yada3 = 3.14159265358979;   // assign a field in the struct
bar2 = bar1;   // copy contents of bar1 to bar2

1> bar只是其類型的單個實例。 您不能有其他與bar類型相同的實例。 它的類型是未命名類型struct,就像匿名聯合一樣。 擁有一個這樣的是合法的。 它更像是全局靜態的(但不是靜態的),只是因為您不能通過其他文件中的extern關鍵字來引用它。任何黑客您都必須在其他文件中引用它...?

3>擁有它是合法的。

4>您不能聲明對您不知道類型的變量的引用。 盡管您可以在文件中的任何位置訪問/修改同一對象,所以無需引用。 引用主要用於從代碼中刪除*和->,否則引用完全可以通過指針進行。

這是否等於聲明static結構?

不,您可以像其他任何static變量一樣使用static關鍵字。 它聲明一個全局變量,即具有靜態存儲持續時間和外部鏈接,等效於:

struct Bar {...};
Bar bar;

在C ++ 11中合法和安全嗎?

是。

如何通過引用訪問欄?

由於類型沒有名稱,因此必須通過模板參數推導或在C ++ 11中進行推斷:

auto & ref = bar;

template <typename Bar> void bar_by_ref(Bar & bar) { 
    /* do something with bar */ 
}

另外,在C ++ 11中,可以通過decltype提取類型:

decltype(bar) & ref = bar;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM