thảo luận Con trỏ pointer trong C/C++ ưu và nhược

Status
Not open for further replies.

cba

Senior Member

Con trỏ pointer trong C/C++ ưu và nhược​

Các bạn thạo nhiều ngôn ngữ thấy tác dụng của con trỏ nó ưu và nhược ntn so với các ngôn ngữ khác?
 
Last edited by a moderator:
Con trỏ không có ưu điểm nào cả. Nhược điểm của nó là rất khó hiểu. Trong Java không có con trỏ. Nên rất dễ hiểu.
thực tế trong java hay c# tất cả đối tượng đều là pointer hết, cứ new ra và check = null là con trỏ cả, do là các ngôn ngữ đó đã bao lại hết con trỏ rồi nên ng dùng cảm thấy là kok có chứ thực tế là con trỏ mọi nơi ở bất kỳ ngôn ngữ nào, con trỏ là nó gắn liền với bộ nhớ máy tính, khi nào máy tính kok xài bộ nhớ nữa thì mới kok còn con trỏ
 
Tùy trinhnf tới đâu mà hiểu tới đó.
VD thím ko hiểu sâu bên dưới đc nên phải nhờ các ngôn ngữ Java C# ... etc bao và trườu tượng khái quát hóa con trỏ lại cho thím thím mới hiểu đc.
Còn người giỏi hơn thím thì ko cần , họ hiểu luôn con trỏ bản chất ra sao.
Con trỏ không có ưu điểm nào cả. Nhược điểm của nó là rất khó hiểu. Trong Java không có con trỏ. Nên rất dễ hiểu.
 
Các bạn thạo nhiều ngôn ngữ thấy tác dụng của con trỏ nó ưu và nhược ntn so với các ngôn ngữ khác?
Các ngôn ngữ khác không có nên chạy chậm hơn
qZV215Z.png

Còn nhược điểm là người học khó tiếp thu hoặc code crash tòe loe mà đéo biết tại sao, debug toàn ra những thứ éo liên quan
qZV215Z.png
 
thực tế trong java hay c# tất cả đối tượng đều là pointer hết, cứ new ra và check = null là con trỏ cả, do là các ngôn ngữ đó đã bao lại hết con trỏ rồi nên ng dùng cảm thấy là kok có chứ thực tế là con trỏ mọi nơi ở bất kỳ ngôn ngữ nào, con trỏ là nó gắn liền với bộ nhớ máy tính, khi nào máy tính kok xài bộ nhớ nữa thì mới kok còn con trỏ
Bổ sung thêm là C# vẫn có kiểu dữ liệu con trỏ nhưng có nhiều hạn chế nên ít dùng hơn.
 
Ưu: đa năng, cần tối ưu thì ok
Nhược: code dễ có bug, thế nên dù rất thích C/ C++ nhưng cái gì tránh được con trỏ vẫn tránh :rolleyes:
 
Con trỏ ưu điểm thì nhiều, cơ bản nhất là tiết kiệm bộ nhớ.
Ví dụ gọi 1 function thay vì copy toàn bộ giá trị của parameter thì nó chỉ cần truyền địa chỉ là dc.
Nhưng nhược điểm cũng lớn!
Ví dụ trong c/c++. Bản thân đây là 1 ngôn ngữ unsafe. Dễ hiểu là vì thời điểm ng ta phát triển các ngôn ngữ này thì các yếu tố về an toàn và bảo mật chưa dc quan tâm. Nên họ cho dev toàn quyền với pointer, ko warning với các lỗi thường gặp.
do đó các lỗi khi sử dụng pointer ko đúng cách dễ bị khai thác.
Điển hình nhất là chrome và microsoft, 70% bug hay các bản update của họ là do liên quan tới các lỗi về memory pointer như use after free, buffer overflow....
Bên chrome nó có cái rule of 2, phải tuân theo khi làm 1 feature mới để tránh các lỗi này!
 
các ngôn ngữ khác cũng pass bằng reference thôi chứ có phải là không có pointer thì đều pass bằng value hết đâu?
 
các ngôn ngữ khác cũng pass bằng reference thôi chứ có phải là không có pointer thì đều pass bằng value hết đâu?

đó là lý do bạn gạch tôi hả?
Thứ nhất đó chỉ là 1 ưu điểm của pointer. Có sai ko? Đây đang so sánh trong C++ giữa việc dùng pointer và ko dùng pointer!

Thứ hai, tôi cũng ko bảo ngôn ngữ khác ko có!
chả lẽ thế thì ko dc tính?
 
không, cả bài viết của bạn như đống cứt luôn, cơ mà tôi lười đéo muốn nói.
nói chung cả bài viết toàn là anecdotal, tôi phục luôn.

:))) ok ok.
Chỗ nào cứt mời bạn chỉ hộ. Mình sẵn lòng tiếp thu :)))

có ngon thì cứ phản biện lại thôi.
Lại bảo là lười đéo muốn nói ::)))
Thế mà có rảnh rỗi ngồi chửi đổng, lol.
Mấy thanh niên giờ hài hước ghê
 
Last edited:
https://www.chromium.org/Home/chromium-security/memory-safety

nguồn cho mấy thanh niên toxic vào đọc.
Mà ở trên đời, tranh luận, đúng sai là điều rất bình thường. Vậy mới tiến bộ.
Mấy thanh niên đéo biết trình độ cỡ nào, mở mồm chê ng ta này nọ mà đéo nói dc 1 câu nào tranh luận tử tế.
Vào chưa cần biết gì cứ phải mở mồm ra chửi đã. Chửi cho nó sướng cái miệng đã, đéo cần biết tôn trọng ng khác gì cả.
Thể loại này tôi khinh hơn chó! Mồm chó ko mọc dc ngà voi!
rác!
 
https://www.chromium.org/Home/chromium-security/memory-safety

nguồn cho mấy thanh niên toxic vào đọc.
Mà ở trên đời, tranh luận, đúng sai là điều rất bình thường. Vậy mới tiến bộ.
Mấy thanh niên đéo biết trình độ cỡ nào, mở mồm chê ng ta này nọ mà đéo nói dc 1 câu nào tranh luận tử tế.
Vào chưa cần biết gì cứ phải mở mồm ra chửi đã. Chửi cho nó sướng cái miệng đã, đéo cần biết tôn trọng ng khác gì cả.
Thể loại này tôi khinh hơn chó! Mồm chó ko mọc dc ngà voi!
rác!

đầu tiên thì có hiểu pointer là cái gì không đã rồi nói tiếp?
dm định trả lời chi tiết cơ mà cảm giác đàn gẩy tai trâu mệt vkl.

> Ví dụ trong c/c++. Bản thân đây là 1 ngôn ngữ unsafe. Dễ hiểu là vì thời điểm ng ta phát triển các ngôn ngữ này thì các yếu tố về an toàn và bảo mật chưa dc quan tâm. Nên họ cho dev toàn quyền với pointer, ko warning với các lỗi thường gặp.
nói câu này thôi là đủ biết đéo biết cái kẹc gì chỉ giỏi phán bừa. lisp ra đời trước c cả chục năm, các khái niệm như GC, automatic memory management đều có cả, cũng có một tá ngôn ngữ khác cùng thời có nhiều thiết kế không có pointer, chú trọng memory safety các kiểu (như pascal thì byte đầu tiên của string là size, đíu bao giờ phải lo vụ null terminated string, array/record của nó cũng là managed)

nhưng mà cuối cùng tại sao mấy thằng kia dẹo gần hết, chỉ có c/c++ là trùm, cho tới bây giờ vẫn là lựa chọn hàng đầu để viết những ứng dụng cốt lõi? đơn giản vì tất cả lựa chọn của nó đều là tối ưu cho performance, cho nên từ đầu tới cuối, chỉ là performace và trade off, đéo liên quan kẹc gì tới mấy cái "an toàn" "bảo mật" mà bạn xl.

mà tiếp đến thì hầu như tất cả các ngôn ngữ hiện tại bây giờ đều phụ thuộc vào c/c++ (bởi vì xuống đến đáy để gọi system call thì phải có các cấu trúc dữ liệu compatible với mấy function của kernel được implement bởi c/c++), aka dù các bạn đíu được dùng thì pointer nó vẫn đang hoàng hoành ở tầng đáy, cái các bạn đang sử dụng chẳng qua là đã bị ẩn sau một vài cái abtraction layer thôi, đừng nói cứ như là nó sắp dẹo cmr. Dù low level như rust lúc nào cũng bô bô tao memory safety, cơ mà đến lúc cần vẫn phải dạng háng ra viết unsafe {}.

khác biệt duy nhất là lúc trước pointer là trao tận tay cho developer, bây giờ nó ẩn đi ở level thư viện hoặc language implemetation thôi.

mà nói memory safety xong lại đi đổ lỗi cho memory management thì khác gì đái dầm đổ tại chim. post cái link kia mà đéo đọc kỹ những gì nó nói, kể cũng phục.

p/s: nhân tiện thì https://news.ycombinator.com/item?id=23288851 , đọc blog mà không xem thảo luận thì đến lúc hiểu sai bị chửi thì đừng đổ lỗi cho bài báo gốc :/
 
Last edited:
đầu tiên thì có hiểu pointer là cái gì không đã rồi nói tiếp?
dm định trả lời chi tiết cơ mà cảm giác đàn gẩy tai trâu mệt vkl.
--> mày đừng bảo tao ko biết pointer là gì. Muốn nói gì cứ nói, tao hầu.


nói câu này thôi là đủ biết đéo biết cái kẹc gì chỉ giỏi phán bừa. lisp ra đời trước c cả chục năm, các khái niệm như GC, automatic memory management đều có cả, cũng có một tá ngôn ngữ khác cùng thời có nhiều thiết kế không có pointer, memory safety các kiểu.
nhưng mà cuối cùng tại sao mấy thằng kia dẹo gần hết, chỉ có c/c++ là trùm, cho tới bây giờ vẫn là lựa chọn hàng đầu để viết những ứng dụng cốt lõi? đơn giản vì tất cả lựa chọn của nó đều là tối ưu cho performance, cho nên từ đầu tới cuối, chỉ là performace và trade off, đéo liên quan kẹc gì tới mấy cái "an toàn" "bảo mật" mà bạn xl.

mà tiếp đến thì hầu như tất cả các ngôn ngữ hiện tại bây giờ đều phụ thuộc vào c/c++ (bởi vì xuống đến đáy để gọi system call thì phải có các cấu trúc dữ liệu compatible với mấy function của kernel được implement bởi c/c++), aka dù các bạn đíu được dùng thì pointer nó vẫn đang hoàng hoành ở tầng đáy, cái các bạn đang sử dụng chẳng qua là đã bị ẩn sau một vài cái abtraction layer thôi, đừng nói cứ như là nó sắp dẹo cmr. Dù low level như rust lúc nào cũng bô bô tao memory safety, cơ mà đến lúc cần vẫn phải dạng háng ra viết unsafe {}.

khác biệt duy nhất là lúc trước pointer là trao tận tay cho developer, bây giờ nó ẩn đi ở level thư viện hoặc language implemetation thôi.

mà nói memory safety xong lại đi đổ lỗi cho memory management thì khác gì đái dầm đổ tại chim. post cái link kia mà đéo đọc kỹ những gì nó nói, kể cũng phục.

==> đọc kỹ giùm tao đoạn này: Around 70% of our high severity security bugs are memory unsafety problems (that is, mistakes with C/C++ pointers). Half of those are use-after-free bugs.
Biết Use-after-free là gì ko? Đến cả dev của Google còn gặp những cái lỗi như thế thì hỏi sao bên ngoài ko lỗi đầy.
Nên sau này c++11/14 mới phải đẻ ra cái smart pointer, để dev khỏe hơn và tránh dc bớt cái lỗi này. Nhưng cục codebase của Chrome nó quá lớn rồi, đến giờ Chrome nó còn đang suy nghĩ có nên cấm xài hẳn luôn raw pointer trong C++ hay ko!
Nói thế để mày hiểu, C++ nó performance là ko sai, nhưng nó unsafe. Đéo phải tự dưng thằng Firefox phải đi chế ra thằng Rust, đéo phải rảnh rỗi nhé.
C++ nó đéo có GC vì nguyên tắc thiết kế của nó, nhưng giờ Google phải đi chế 1 cái GC library cho Chromium!

Còn cách đây mấy chục năm, lúc đó "an toàn" hay "bảo mật" thông tin nó đéo phải là cái gì ghê gớm. Đó là sự thật,
nên các thiết kế lúc đó đều ko quá care tới chuyện này, bản thân cái raw pointer nó là 1 ví dụ điển hình.
Đéo riêng gì C++ mà rất nhiều thiết kế đều gặp vấn đề đó, nhất là các thiết kế bên network protocol. Sau này người ta mới khắc phục dần thôi.
Mày cứ thử đi dạo 1 vòng các cuộc thi tìm lỗ hổng đi, xem bao nhiêu thằng lợi dụng các lỗi về "buffer overflow", "use-after-free" mà đoạt giải.
C++ như 1 con dao sắc vậy, chơi dao sắc thì có ngày đứt tay. Thế thôi!

Đéo riêng gì Google, tới cả thằng Microsoft cũng thế. Những bản update windows/office 70% là để vá các lỗ hổng như "use-after-free".
Tất nhiên, có những nơi, C++ ko thể thay thế. Đó là sự thật và C++ là 1 ngôn ngữ mạnh, tao ko phủ định điều này. Nhưng nó có nhược điểm, và trong cái thớt này, tao nói về pointer và nhược điểm của memory management trong C++.
 
Status
Not open for further replies.
Back
Top