查看完整版本 : c++ struct 加*同唔加*有咩分別?

jail_dust 2018-3-13 05:11

struct [b]newProject [/b]{        
string projectName
};

[b]newProject [/b]filminfo;

bool 123 {
  cout << "Please enter project name" << endl;
  cin >> filminfo.projectName;
}

唔知點解,我加*上去同埋將.改為->,就會出error

林珍兒 2018-3-13 10:28

我老喇,如果我冇記錯,加星係 pointer。pointer 用 ->

syntactic18 2018-3-13 10:41

1. 加*=pointer, uninitialized pointer唔可以用, 
2. 唔加*會call default constructor

marlin12 2018-3-13 11:39

[align=left][quote]原帖由 [i]jail_dust[/i] 於 2018-3-13 05:11 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476757830&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url][/align]
[align=left]bool 123 {[/align]
[align=left]  cout << "Please enter project name" << endl;  [/align]
[align=left]  cin >> filminfo.projectName;[/align]
[align=left]}[/quote][/align]
[align=left]"bool 123 {...}" 呢段係咩嚟?如果係method,method名唔可以係數字,method名後面又無parameter list既(),如果無野return,return type應該係void(唔係bool)。[/align]
[align=left][code]void GetProjectName() {       cout << "lease enter project name" << endl;       cin >> filminfo.projectName;}[/code][/align]

marlin12 2018-3-13 11:45

[quote]原帖由 [i]syntactic18[/i] 於 2018-3-13 10:41 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476766527&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
1. 加*=pointer, uninitialized pointer唔可以用, ...
[/quote]
轉咗做pointer咪去initialize佢囉。[code]newProject* filminfo = new newProject;
cin >> filminfo->projectName;[/code]順便提醒樓主,new出嚟既variable,用完記得delete,唔係會memory leak。

[[i] 本帖最後由 marlin12 於 2018-3-13 02:56 PM 編輯 [/i]]

Susan﹏汪汪 2018-3-13 13:02

樓主應該搵篇教學係詳細講解pointer呢個課題

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

darigold 2018-3-14 14:47

你試下將 start = clock(); 和 name* myStructPtr = new name[N] 調一下,睇下個速度?

marlin12 2018-3-14 21:49

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-13 08:21 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476796116&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Pointer  效能差,一般唔係要求太大塊的memory, 唔需要用。
8014854 [/quote]
pointer variable要去heap度allocate memory,又要allocation table、又要redirect,當然唔夠stack memory一早allocate咗畀你咁快。
但係,我唔係咁睇!在windows上開發既native app,我覺得盡可能用heap memory。原因係stack memory既size有限,又唔guarantee有幾多,但係就大把人跟你搶(MFC、Win32 api、...),call一次function已經幾廿個level和成蘿stack,用咗幾多根本就控制唔到。最大獲係stack overflow果時,輕則彈個exception出嚟,再唔係blue screen,重則寫花野都唔知。後果實在太嚴重!

pointer除咗用嚟攞heap memory之外,仲可以用來做variable reference、function delegation、和處理特別既data structure(例如:map、linked list)。如果用得好,仲可以減少浪費memory。起初我學用pointer果時,係用在MCU既register mapping,如果C無呢樣野,都唔知點搞。

其實,如果樓主唔熟C++,而又唔係要call win32 api,我會建議佢轉用C#,一來可以避開pointer,二來.net framework又user friendly好多,加上C#比較好用和有效率。我轉咗用C#之後,都唔想再掂C++。

[[i] 本帖最後由 marlin12 於 2018-3-15 10:57 PM 編輯 [/i]]

jasonchan35 2018-3-15 02:42

[url]https://www.youtube.com/watch?v=OG5DCfMnS5Q&index=12&list=PLeGk08zVu454WgM_8uE-dUayT_EOoVEQS[/url]

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

Susan﹏汪汪 2018-3-15 08:36

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-15 07:05 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476874996&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


試左, 結果都係差唔多。今次我將個 int + 個 double:fst_016:
http://textuploader.com/dx822


non-pointer struct takes 49.000000 ms
pointer struct takes 147.000000 ms

pointer 係慢好多。

[/quote]
可能關lazy allocation事

darigold 2018-3-15 09:52

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-3-15 08:36 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476877039&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

可能關lazy allocation事 [/quote]
好奇怪的結果
有冇profile?

sswroom 2018-3-15 12:18

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-13 08:21 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476796116&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]


Pointer  效能差,一般唔係要求太大塊的memory, 唔需要用。

8014854 [/quote]不是Pointer效能差, 而是你的Compiler直接跳過部分Code沒有執行
你試試用volatile name myStruct[N] 和 volatile name *myStructPtr來避免Compiler跳過Code的問題
還有, 你的程式有個Bug, 就是c[15]不夠位放

Susan﹏汪汪 2018-3-15 13:04

[quote]原帖由 [i]darigold[/i] 於 2018-3-15 09:52 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476880579&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

好奇怪的結果
有冇profile? [/quote]
系統差異係一大問題
汪汪唔知佢用咩系統

如果係macOS的話
佢allocated 一大塊memory 系統一定是用mmap方法
而mmap只要你唔郁佢就會lazy allocate

再加上個struct的initializer本身只是填零
也可能optimzer optimizing 的時候直接假設到時的allocated memory 系統會自動清空

所以唔會有initialize的動作、結果就是需要等到個pointer被人郁果時先開始真正allocate memory

darigold 2018-3-15 13:16

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-3-15 01:04 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476890922&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

系統差異係一大問題
汪汪唔知佢用咩系統

如果係macOS的話
佢allocated 一大塊memory 系統一定是用mmap方法
而mmap只要你唔郁佢就會lazy allocate

再加上個struct的initializer本身只是填零
也可能optimzer optimi ... [/quote]


alloc 定 commit 先?
allocate 只是占了 address space,這點是不能lazy的,另外一個 thread 來占了同一個 address 就完了。
可能 address space 下沒有真正的 physical page ﹐直到真正 read/write 才開始 page fault 。
如果在 Windows ,可以試試看 Perf Counters,睇下咩情況 …

Susan﹏汪汪 2018-3-15 13:16

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-3-15 01:04 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476890922&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

系統差異係一大問題
汪汪唔知佢用咩系統

如果係macOS的話
佢allocated 一大塊memory 系統一定是用mmap方法
而mmap只要你唔郁佢就會lazy allocate

再加上個struct的initializer本身只是填零
也可能optimzer optimi ... [/quote]
暫時諗到的理論係咁

可以試試start = clock();之前memset zero

Susan﹏汪汪 2018-3-15 13:23

[quote]原帖由 [i]darigold[/i] 於 2018-3-15 01:16 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476891633&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]



alloc 定 commit 先?
allocate 只是占了 address space,這點是不能lazy的,另外一個 thread 來占了同一個 address 就完了。
可能 address space 下沒有真正的 physical page ﹐直到真正 read/write 才開始 ... [/quote]
所以話系統差異係問題

Windows 的情況汪汪冇辦法試

如果係POSIX mmap
係容許mmap先佔用vm 的address space
其他thread不會佔用一樣的address

但address之下係可以冇physical memory
到有read/write時先再分配

Susan﹏汪汪 2018-3-15 13:37

[code]

int * array = (int*)malloc(N * sizeof(int));

array[0] = 1;      // out of memory

free(array);

[/code]
諗起
呢D情況係完全可以發生

Susan﹏汪汪 2018-3-15 14:00

[url=https://github.com/SusanDoggie/Doggie/blob/master/Sources/Doggie/Foundation/MappedBuffer.swift#L73-L74]https://github.com/SusanDoggie/Doggie/blob/master/Sources/Doggie/Foundation/MappedBuffer.swift#L73-L74[/url]

話說
早果排汪汪針對呢個特性、做左少少optimize

基本上swift 主要行得到的OS全部都是能夠假設mmap的memory 是zero-filled

所以加左果兩行code
如果repeatedValue是全零的話、直接skip左initialize

結果如果是要一塊全零的memory
整個MappedBuffer的alloc時間一下子變成0秒

[[i] 本帖最後由 Susan﹏汪汪 於 2018-3-15 02:01 PM 編輯 [/i]]

marlin12 2018-3-15 21:35

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-15 03:48 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476872780&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
咁你用 pointer, 你得 10MB ram, 要 allocate 50MB 野, 都彈 app 架啦, 無分別架!  [/quote]
你講得呢句話,證明你係唔了解stack memory和heap memory既分別。
假設在free memory pool入面有2個address不連續既blocks,分別係10MB和40MB。windows系統是可以allocate到最多10MB+40MB既heap memory或者最多40MB既stack memory。因為stack memory必須要係連續既。

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-15 03:48 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476872780&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
只要做好 try catch assertion ... 應該無問題 [/quote]
又錯啦!自從.net framework 2.0開始,已經唔可以用try/catch block去捕捉StackOverflowException,而相應既process係會停止運行。
[quote](Microsoft Developer Network資料)
Starting with the .NET Framework 2.0, you can’t catch a StackOverflowException object with a try/catch block, and the corresponding process is terminated by default.[/quote]
.
[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-15 03:48 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476872780&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
而且一般 app 都唔會資料量大到 stack 都 handle 唔到。[/quote]
好似樓主寫果個電影database既app咁,隨著record既數目不斷增加,個stack遲早會爆。
(備註:visual c++既default stack size,只有1MB。)

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-15 03:48 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=476872780&ptid=27304947][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
但係重覆計算的話, 速度就慢左了 (若用 pointer), 而且寫曲時又要好小心要記住 free 返 pointer[/quote]
點解heap memory又慢(相對於stack memory)、又容易memory leak都要用呢?原因係可以靈活咁運用memory呢樣有限既資源。
在windows系統入面,有好多program行緊。如果每個program在開始時,都攞個好大既stack來放晒全部既variable,到結束時先至放番出嚟,咁就多多RAM都唔夠用。
正確既做法係,除咗一啲必須既variable,個program有需要果時,先至去heap果度攞memory,用完之後盡快放番出嚟,畀其他program用。
(備註:點解我圍繞住講stack memory和heap memory,因為佢地分別係儲存non-pointer variable和pointer variable既地方。)

[[i] 本帖最後由 marlin12 於 2018-3-16 06:47 AM 編輯 [/i]]

syntactic18 2018-3-16 00:23

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-15 03:48 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476872780&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
咁你用 pointer, 你得 10MB ram, 要 allocate 50MB 野, 都彈 app 架啦, 無分別架! 只要做好 try catch assertion ... 應該無問題, 而且一般 app 都唔會資料量大到 stack 都 handle 唔到。但係重覆計算的話, 速度就慢 ... [/quote]

smart pointer可以解決你嘅煩惱

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

Susan﹏汪汪 2018-3-16 08:31

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-16 06:18 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476928544&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


試左 volatile .......... 不過我發覺無任何結論。事情是咁的。當我用原 code 比較時, 加左 volatile 之後, 發覺反而 pointer struct 快過 non pointer struct 近 1 倍!!!

但我再改少少, 就係原先個 char c1[ ... [/quote]
兩者速度相同就代表正常

Susan﹏汪汪 2018-3-16 11:36

[quote]原帖由 [i]marlin12[/i] 於 2018-3-15 09:35 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476915395&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]

你講得呢句話,證明你係唔了解stack memory和heap memory既分別。
假設在free memory pool入面有2個address不連續既blocks,分別係10MB和40MB。windows系統是可以allocate到最多10MB+40MB既heap memory或者最多40 ... [/quote]
[quote]假設在free memory pool入面有2個address不連續既blocks,分別係10MB和40MB[/quote]
係指physical memory定virtual address space?

如果係virtual address space
正常來講heap memory係放係low address(正值)
32-bits application理論上不超過2GB
stack memory 放係high address(負值), 一樣32-bits application 不超過2GB

Low address + high address就是整個virtual address space能表示的範圍, 32-bits application就是4GB

但如果話free memory pool 的不連續blocks
係指physical memory的話、是不是連續都對heap memory和stack memory冇影響
因為applciation正常只見到的係virtual address space, virtual address是連續就冇問題
同physical memory係咪連續冇關

煙民母親生賤種

*** 作者被禁止或刪除 內容自動屏蔽 ***

Susan﹏汪汪 2018-3-16 20:33

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2018-3-16 08:30 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=476965272&ptid=27304947][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


有無搞錯啊?!係人都知 Stack?快過?heap?啦!同速先唔正常啊!你都無研究過就話正常。。。😣😣😣😭😭 [/quote]
就正正因為正常是一樣速度

darigold 同汪汪先會覺得第一次測試的時間不合理
所以叫你試下把start = clock();放係new 之後
頁: [1] 2
查看完整版本: c++ struct 加*同唔加*有咩分別?