c++ c++教學 - 初始化結構中的默認值




c++意思 tutorial (5)

您甚至不需要定義構造函數

struct foo {
    bool a = true;
    bool b = true;
    bool c;
 } bar;

澄清一下:這些被稱為大括號或大小相等(因為你也可以使用大括號初始化而不是等號)。 這不僅適用於聚合:您可以在普通的類定義中使用它。 這是在C ++ 11中添加的。

如果我只需要初始化C ++結構的幾個選擇值,那麼這是正確的:

struct foo {
    foo() : a(true), b(true) {}
    bool a;
    bool b;
    bool c;
 } bar;

我是否正確地假設我最終得到一個名為bar struct項,其元素為bar.a = truebar.b = true和未定義的bar.c


是。 bar.abar.b設置為true,但bar.c未定義。 但是,某些編譯器會將其設置為false。

在這裡查看一個實例: struct demo

根據C ++標準第8.5.12節:

如果未執行初始化,則具有自動或動態存儲持續時間的對象具有不確定的值

對於原始內置數據類型( bool ,char,wchar_t,short,int,long,float,double,long double),如果未顯式初始化,則只有全局變量(所有靜態存儲變量)的默認值為零。

如果你真的不想bar.c定義的bar.c開始,你也應該像bar.abar.b那樣初始化它。


顯式默認初始化可以幫助:

struct foo {
    bool a {};
    bool b {};
    bool c {};
 } bar;

行為bool a {}bool b = bool(); 並返回false


您可以使用構造函數來執行此操作,如下所示:

struct Date
{
int day;
int month;
int year;

Date()
{
    day=0;
    month=0;
    year=0;
}
};

或者像這樣:

struct Date
{
int day;
int month;
int year;

Date():day(0),
       month(0),
       year(0){}
};

在你的情況下,bar.c是未定義的,它的值取決於編譯器(而a和b設置為true)。


你有沒有嘗試傳遞-funroll-loops -fprefetch-loop-arrays到GCC?

通過這些附加優化,我得到以下結果:

[1829] /tmp/so_25078285 $ cat /proc/cpuinfo |grep CPU|head -n1
model name      : Intel(R) Core(TM) i3-3225 CPU @ 3.30GHz
[1829] /tmp/so_25078285 $ g++ --version|head -n1
g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3

[1829] /tmp/so_25078285 $ g++ -O3 -march=native -std=c++11 test.cpp -o test_o3
[1829] /tmp/so_25078285 $ g++ -O3 -march=native -funroll-loops -fprefetch-loop-arrays -std=c++11     test.cpp -o test_o3_unroll_loops__and__prefetch_loop_arrays

[1829] /tmp/so_25078285 $ ./test_o3 1
unsigned        41959360000     0.595 sec       17.6231 GB/s
uint64_t        41959360000     0.898626 sec    11.6687 GB/s

[1829] /tmp/so_25078285 $ ./test_o3_unroll_loops__and__prefetch_loop_arrays 1
unsigned        41959360000     0.618222 sec    16.9612 GB/s
uint64_t        41959360000     0.407304 sec    25.7443 GB/s




c++