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ỏ
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.
học ở đâu mà kiến thức cao siêu vậy fen
zulu
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.
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.
dogamer01
Ư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
Fire Of Heart
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!
Nipin
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?
đó 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?
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.
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!
L1f3 ver 2
Vđ thanh niên dangmt kia cứ thread về C++ là vào chê bai với so Java là sao, thằng điên à
Nipin
mình 92, lương tầm 17.
Trước có công việc nhận thì apply lương 1k5 trump ngay, nhưng sẽ phải đánh đổi rất nhiều thời gian và công sức, với chưa biết nó có bền không nên mình chọn ở lại.
Ngày mình làm thực tế chắc 1-3 tiếng (quản lý 52 mạng, công việc tự quản lý, không ai quản lý, ko KPI)
nghỉ thứ 7-CN, chiều 4h cắp đít về, 1 năm nghỉ 3 đợt lễ 10 ngày, tháng trung bình 20 công. Thời gian dư mình kinh doanh trung bình cũng thêm 30-60m 1 tháng.
Việc 1k5 trump kia là việc đối ngoại, phải sử dụng rượu bia nhiều nên tính ra cao nhưng cũng chỉ là đánh đổi thời gian, mình không thể làm ngoài được. Nên thôi.
Fire Of Heart
đầ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++.
L1f3 ver 2
vl thớt kiến thức mà cũng đi chửi lộn đc, chịu
flowerfx2
ơ vl giờ vào đây lại thành chửi nhau
Nipin
bạn nào thông não với tôi về chuyện google chrome quyết định thêm gc, dùng Miracle<Ptr>, thêm bound checking vì lý do security (với trade off là performance) thì liên quan gì đến pointer với?
thêm nữa, mấy cái buffer overflow nó do null terminated string với bound checking chứ liên quan gì tới pointer nhỉ, tới giờ tôi vẫn đéo hiểu?
bạn nào thông não với tôi về chuyện google chrome quyết định thêm gc, dùng Miracle<Ptr>, thêm bound checking vì lý do security (với trade off là performance) thì liên quan gì đến pointer với?
thêm nữa, mấy cái buffer overflow nó do null terminated string với bound checking chứ liên quan gì tới pointer nhỉ, tới giờ tôi vẫn đéo hiểu?
nếu dùng con trỏ thô theo đúng code c thì nó là 1 con trỏ thuần khiết, khi a gọi hàm cấp phát vùng nhớ là malloc hay cấp phát tĩnh thì ở hđh sẽ tạo vùng nhớ đúng với số byte a yêu cầu, nhưng điều đó kok có nghĩa là a kok có thể truy xuất dc vùng nhớ bên ngoài vùng a dc cấp phát, nôm na là con trỏ thô lưu địa chỉ vùng nhớ , còn ai đi bao xa hay đi lùi bao xa từ địa chỉ đó cũng dc, có thể đọc và ghi vào vùng nhớ kok dc cấp phép do a đang dùng con trỏ đều dc cả, điều này sẽ kok ổn ở design software nhưng giới hacker thì rất mê mẫn món này nên đám google hay ms mới ra sức hạn chế con trỏ thô truy xuất lung tung
tôi cũng dính 1 phát vụ con trỏ thô truy xuất vùng nhớ lạ đây, tôi cấp vùng nhớ cho nó dạng byte , kích thước là 256 , nhưng mà index = số âm hay số > 256 nó vẫn get ra đc thông tin và truyền lên server làm mất cả buổi chiều ngẫn ngơ ra vì có ký tự lạ trên hệ thống
nếu dùng con trỏ thô theo đúng code c thì nó là 1 con trỏ thuần khiết, khi a gọi hàm cấp phát vùng nhớ là malloc hay cấp phát tĩnh thì ở hđh sẽ tạo vùng nhớ đúng với số byte a yêu cầu, nhưng điều đó kok có nghĩa là a kok có thể truy xuất dc vùng nhớ bên ngoài vùng a dc cấp phát, nôm na là con trỏ thô lưu địa chỉ vùng nhớ , còn ai đi bao xa hay đi lùi bao xa từ địa chỉ đó cũng dc, có thể đọc và ghi vào vùng nhớ kok dc cấp phép do a đang dùng con trỏ đều dc cả, điều này sẽ kok ổn ở design software nhưng giới hacker thì rất mê mẫn món này nên đám google hay ms mới ra sức hạn chế con trỏ thô truy xuất lung tung
tôi cũng dính 1 phát vụ con trỏ thô truy xuất vùng nhớ lạ đây, tôi cấp vùng nhớ cho nó dạng byte , kích thước là 256 , nhưng mà index = số âm hay số > 256 nó vẫn get ra đc thông tin và truyền lên server làm mất cả buổi chiều ngẫn ngơ ra vì có ký tự lạ trên hệ thống
Cũng ko thấy bound check thì liên quan gì con trỏ lắm
nếu dùng con trỏ thô theo đúng code c thì nó là 1 con trỏ thuần khiết, khi a gọi hàm cấp phát vùng nhớ là malloc hay cấp phát tĩnh thì ở hđh sẽ tạo vùng nhớ đúng với số byte a yêu cầu, nhưng điều đó kok có nghĩa là a kok có thể truy xuất dc vùng nhớ bên ngoài vùng a dc cấp phát, nôm na là con trỏ thô lưu địa chỉ vùng nhớ , còn ai đi bao xa hay đi lùi bao xa từ địa chỉ đó cũng dc, có thể đọc và ghi vào vùng nhớ kok dc cấp phép do a đang dùng con trỏ đều dc cả, điều này sẽ kok ổn ở design software nhưng giới hacker thì rất mê mẫn món này nên đám google hay ms mới ra sức hạn chế con trỏ thô truy xuất lung tung
tôi cũng dính 1 phát vụ con trỏ thô truy xuất vùng nhớ lạ đây, tôi cấp vùng nhớ cho nó dạng byte , kích thước là 256 , nhưng mà index = số âm hay số > 256 nó vẫn get ra đc thông tin và truyền lên server làm mất cả buổi chiều ngẫn ngơ ra vì có ký tự lạ trên hệ thống
còn vụ pointer arithmetic thì đúng là ra lắm vấn đề thật, nhưng đó là vấn đề với arithmetic, chứ anh dùng pointer như reference (aka const pointer) thì nó có vấn đề gì đâu, nếu có thì do anh check bound sai
thực ra tôi thấy vụ chúng nó khuyến khích dùng wrapper type là bởi vì dùng cái này sẽ buộc phải dùng các function mới được viết đã chú trọng security checking sẵn (mấy cái function cũ nhiều khi không có vì lý do performance) là chính, chứ đổ lỗi hết cho pointer tôi thấy vớ vẩn vãi.
còn vụ pointer arithmetic thì đúng là ra lắm vấn đề thật, nhưng đó là vấn đề với arithmetic, chứ anh dùng pointer như reference (aka const pointer) thì nó có vấn đề gì đâu, nếu có thì do anh check bound sai
thực ra tôi thấy vụ chúng nó khuyến khích dùng wrapper type là bởi vì dùng cái này sẽ buộc phải dùng các function mới được viết đã chú trọng security checking sẵn (mấy cái function cũ nhiều khi không có vì lý do performance) là chính, chứ đổ lỗi hết cho pointer tôi thấy vớ vẩn vãi.
tất nhiên lỗi trong code thì thấy là fix thôi nhưng mà tôi bị dính phát index tới mấy chục k trong khi tôi chỉ cấp cho nó có 256 nó vẫn get ra thông tin và đẩy lên server hay index âm thì vẫn lấy dc chứng tỏ là mấy cái lý thuyết xuông bên trên nó cũng khá là vô nghĩa, vì tôi đã chứng minh là nó sai rồi đây, thậm chí là ứng dụng chả crash mẹ j cả, à tôi chạy trên android & windows bị dính, còn ios thì chưa kịp tesy thì fix rùi
còn kok tin a cứ test lại, nhớ dùng malloc hay mảng tĩnh nhé, compiler là code c chứ kok phải cpp, dùng gcc cũng dc
tất nhiên lỗi trong code thì thấy là fix thôi nhưng mà tôi bị dính phát index tới mấy chục k trong khi tôi chỉ cấp cho nó có 256 nó vẫn get ra thông tin và đẩy lên server hay index âm thì vẫn lấy dc chứng tỏ là mấy cái lý thuyết xuông bên trên nó cũng khá là vô nghĩa, vì tôi đã chứng minh là nó sai rồi đây
ờ có thể là app của anh nó tự động allocate memory ở đâu đó, địa chỉ anh truy cập vẫn nằm trong program của anh, chứ chuyện anh có thể truy cập ram ngẫu nhiên của hệ thống là hoàn toàn không thể nào (trừ khi os anh dùng chỉ có ring 0 như temple os =) )
vụ này cực kỳ quan trọng vì nếu process này đọc được memory của process kia thì cần vẹo gì spectre hay meltdown, chỉ cần upload program lên cái vps là trộm sạch được thông tin của cả cái dedicated server bên ngoài rồi
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.
ZenChan
Gần đây mình có biết là khi pass pointer vào function, sẽ mất thêm thời gian để Escape Analysis check xem value đang là trên stack hay heap, nếu là heap thì lại tốn xíu thời gian nữa để chạy garbage collector. Nên nếu nói dùng pointer thì nhanh hơn thì chưa hẳn. Với lại dùng poniter có cảm giác nó không pure lắm.
Last edited:
Fire Of Heart
Pointer nó như 1 công cụ đa năng vậy. Xài ko đúng cách thì sẽ phát sinh nhiều vấn đề.
Trong C++ ko có GC vì vấn đề performance. Ngay cả smartpointer thì tạm coi như là 1 bản fix cho quá nhiều lỗi xảy ra trên các hệ thống lớn với raw pointer. Cái smartpointer rất hay, nhưng mà các codebase lớn ko chuyển qua C++11/14 ngay được. Ví dụ như Chromium, phải 2015 mới chuyển qua C++11, nhưng bên trong vẫn còn rất nhiều raw pointer.
Một số issue nghiêm trọng liên quan tới raw pointer mà có thể ảnh hưởng tới security thì như thế này:
Cái out-of-bound chính là cái issue mà
@flowerfx2 nhắc tới. Ông có 1 list 10 item, mà ông access vào item -1 hay item 11, vậy chuyện gì xảy ra?
Với những memory unsafe language như C/C++, thì lúc này, trừ khi thằng dev kiểm tra một cách chặt chẽ, còn ko, nó vẫn sẽ trả về cái vùng nhớ ở địa chỉ đó, còn với memory safe language thì sẽ trả về lỗi, crash, v.v... Nhưng ít nhất nó đỡ hơn là cho phép đọc.
Ví dụ giờ cái item ở vị trí 11 là ... key của SSL/TLS thì sao, ok lúc này chúng ta có Heart bleed
https://en.wikipedia.org/wiki/Heartbleed Heart Bleed chính là điển hình của việc lợi dụng lỗi out-of-bound để đọc thông tin private key.
Lỗi này xuất hiện trong thư viện OpenSSL.
Cứ tưởng tượng lỗi tương tự với Chrome xem
Cách đây 20 năm, performance nó là cái gì đó rất quan trọng. Nhưng bây giờ thì ko!
Khi phát triển 1 phần mềm/hệ thống như Chrome/Chromium, thì security nó mới là ưu tiên hàng đầu.
Phần cứng phát triển mạnh, giá rẻ, giờ một cái điện thoại tầm trung bây giờ có khi còn mạnh hơn một cái máy tính cá nhân thường thường 10 năm trước.
Last edited:
FinalDevil
C/C++ là ngôn ngữ gì? Chỉ biết có mỗi C/Dzava.
cba
Nếu code scrip nho nhỏ C/C++ thì khó mà hình dung được điểm tối ưu của con trỏ vì có lẽ chẳng bao giờ dùng đến nó. Game, hệ thống tài chính, webserver phải dùng pointer như một cách kiểm soát hiệu năng vì bản chất con trỏ dung lượng siêu nhỏ. Nhược điểm là rò rỉ bug nhiều do con người k đủ khả năng kiểm soát tối đa pointer
flowerfx2
nói chung con trỏ thuần khiết thì có tốc độ tối đa và kok có cái security nào, còn những thứ họ bao lại con trỏ là để fix cái security thôi, ai muốn làm hắc cơ thì cứ tìm hiểu con trỏ thô rồi deploy lên tìm các địa chỉ lưu giá trị của hệ thống như thông tin ngân hàng, thẻ tín dụng, password .... thì chả mấy chốc thành tỷ phú, bên các hãng phần mềm lớn như win hay android đang cố fix mấy cái này nhưng có vẻ vẫn chưa hết
bạn nào thông não với tôi về chuyện google chrome quyết định thêm gc, dùng Miracle<Ptr>, thêm bound checking vì lý do security (với trade off là performance) thì liên quan gì đến pointer với?
thêm nữa, mấy cái buffer overflow nó do null terminated string với bound checking chứ liên quan gì tới pointer nhỉ, tới giờ tôi vẫn đéo hiểu?
Pointer thì cũng có liên quan đến cấp phát động - heap ( tất nhiên ko phải cứ pointer là đều chỉ về vùng heap ), và các lỗi overflow trên đó người ta gọi chung là Heap Overflow, một nguyên nhân dẫn đến User after free. Về lỗi của pointer có các kiểu như là dangling pointer, double free, ...
Quan điểm của em trước đến h vẫn là: Ngôn ngữ ko có lỗi, lỗi là do người dùng
, nên nói rằng ngôn ngữ này bảo mật hơn ngôn ngữ kia là ko đúng lắm.
còn vụ pointer arithmetic thì đúng là ra lắm vấn đề thật, nhưng đó là vấn đề với arithmetic, chứ anh dùng pointer như reference (aka const pointer) thì nó có vấn đề gì đâu, nếu có thì do anh check bound sai
thực ra tôi thấy vụ chúng nó khuyến khích dùng wrapper type là bởi vì dùng cái này sẽ buộc phải dùng các function mới được viết đã chú trọng security checking sẵn (mấy cái function cũ nhiều khi không có vì lý do performance) là chính, chứ đổ lỗi hết cho pointer tôi thấy vớ vẩn vãi.
Bác có thể access vào bộ nhớ của thằng khác mà ko hề bị segfault nhé
, windows thì là hàm writeMemProcess(), macos thì là vm_write, linux xài mem_fd và một cơ số hàm. Tất nhiên là để dùng đc bọn này thì phải thoả mãn một số điều kiện, nhg ko phải là ko thể
nói chung
con trỏ thuần khiết thì có tốc độ tối đa và kok có cái security nào, còn những thứ họ bao lại con trỏ là để fix cái security thôi, ai muốn làm hắc cơ thì cứ tìm hiểu con trỏ thô rồi deploy lên tìm các địa chỉ lưu giá trị của hệ thống như thông tin ngân hàng, thẻ tín dụng, password .... thì chả mấy chốc thành tỷ phú, bên các hãng phần mềm lớn như win hay android đang cố fix mấy cái này nhưng có vẻ vẫn chưa hết
máy tính làm gì có hiểu thế nào là security, thế nào là tốc độ tối đa đâu bác, do con người cả, con người ko thêm mitigation nào cho những cái "con trỏ" đó thì nó ko security, vậy thôi. Nên đổ lỗi cho ngôn ngữ, hay những khái niệm, cấu trúc dữ liệu mà ngôn ngữ đó đưa ra là ko đúng
Pointer thì cũng có liên quan đến cấp phát động - heap ( tất nhiên ko phải cứ pointer là đều chỉ về vùng heap ), và các lỗi overflow trên đó người ta gọi chung là Heap Overflow, một nguyên nhân dẫn đến User after free. Về lỗi của pointer có các kiểu như là dangling pointer, double free, ...
Quan điểm của em trước đến h vẫn là: Ngôn ngữ ko có lỗi, lỗi là do người dùng
, nên nói rằng ngôn ngữ này bảo mật hơn ngôn ngữ kia là ko đúng lắm.
theo tôi hiểu thì lỗi ở đây là memory management, aka do người dùng? tất nhiên pointer là low level nó dùng khó hơn, không có safety net thì đúng là tạo ra nhiều lỗi hơn, cơ mà tôi thấy pointer nó có tội lỗi gì đâu, các bạn không muốn tự quản lý memory thì dùng gc, dùng smart pointers các kiểu ai cấm?
Bác có thể access vào bộ nhớ của thằng khác mà ko hề bị segfault nhé
, windows thì là hàm writeMemProcess(), macos thì là vm_write, linux xài mem_fd và một cơ số hàm. Tất nhiên là để dùng đc bọn này thì phải thoả mãn một số điều kiện, nhg ko phải là ko thể
mấy cái này là system call? như vậy là vẫn phải qua hệ thống chứ có tự access bừa được đâu?
ờ mà không qua hệ thống vẫn access memory thằng khác được, nhưng đấy là dùng lỗi bảo mật để tăng privilege, cái này again là dính vào os, chứ đâu phải cứ cast pointer là random access memory của process khác được?
máy tính làm gì có hiểu thế nào là security, thế nào là tốc độ tối đa đâu bác, do con người cả, con người ko thêm mitigation nào cho những cái "con trỏ" đó thì nó ko security, vậy thôi. Nên đổ lỗi cho ngôn ngữ, hay những khái niệm, cấu trúc dữ liệu mà ngôn ngữ đó đưa ra là ko đúng
thì mình đánh giá khách quan thui mà bác, với mình xài quen con trỏ rùi , dùng thiếu nó thấy khó chịu lắm, cuối cùng là ăn thua do thằng dev thui chứ ngôn ngữ kok có lỗi j cả
theo tôi hiểu thì lỗi ở đây là memory management, aka do người dùng? tất nhiên pointer là low level nó dùng khó hơn, không có safety net thì đúng là tạo ra nhiều lỗi hơn, cơ mà tôi thấy pointer nó có tội lỗi gì đâu, các bạn không muốn tự quản lý memory thì dùng gc, dùng smart pointers các kiểu ai cấm?
mấy cái này là system call? như vậy là vẫn phải qua hệ thống chứ có tự access bừa được đâu?
ờ mà không qua hệ thống vẫn access memory thằng khác được, nhưng đấy là dùng lỗi bảo mật để tăng privilege, cái này again là dính vào os, chứ đâu phải cứ cast pointer là random access memory của process khác được?
- Thì em có nói là liên quan gì đến pointer đâu, pointer là một khái niệm đc đưa ra bởi các ngôn ngữ lập trình để chỉ việc ô nhớ nảy trỏ đến ô nhớ kia, chứ nó chả có hình thù gì mà có lỗi cả.
- Đúng như bác nói, và cũng như quan điểm em đã nêu, lỗi do người dùng chứ chả liên quan gì đến ngôn ngữ hay gì cả, vì các hàm đó đc viết ra cũng để phục vụ các việc khác, nhg do hệ thống thiết kế chưa chuẩn nên có thể người dùng đc gọi các hàm đó chả hạn.
- Cái hàm nào mà tác động xuống kernel thì đều là system call thôi bác
, chứ có hàm nào muốn tác động đến hệ thống mà ko qua system call đâu? Em nêu các hàm đó ở đây là để đưa ra ví dụ là hoàn toàn 1 thằng có chủ đích xấu có thể access vào mem của proc khác thôi, chứ người dùng "bình thường" thì đâu cast vậy làm gì
- Cái hàm nào mà tác động xuống kernel thì đều là system call thôi bác
, chứ có hàm nào muốn tác động đến hệ thống mà ko qua system call đâu? Em nêu các hàm đó ở đây là để đưa ra ví dụ là hoàn toàn 1 thằng có chủ đích xấu có thể access vào mem của proc khác thôi, chứ người dùng "bình thường" thì đâu cast vậy làm gì
ờ nhưng mà ở đây đang nói đến mấy thằng như chrome, security bug là do thằng khác dùng unsafe input tạo bug, sau đó lợi dụng bug lấy thông tin từ remote machine thôi, chứ có local access (chạy random program trong pc) thì nói làm gì nữa
... mà dm tôi không hiểu là tại sao lại lôi thằng chromium vào, mấy project dài 25 triệu dòng code, vài nghìn active dev, support đủ thứ từ network tới media, include đủ loại 3rd party libraries, trong khi project thường chỉ vài chục nghìn dòng code code bởi một vài người. scope có giống nhau đâu mà quy chụp được?
L1f3 ver 2
2 người lệch pha nhau chứ sao nữa
, một người thì thấy lỗi của pointer ( đa số lỗi bây h đều liên quan đến con trỏ hết, ko còn dạng đơn thuần BoF nữa ) nên bảo dùng pointer rất nguy hiểm, và ổng đưa ra ví dụ như chrome --> Có nhiều loại lỗi nguy hiểm ko chỉ có mỗi pointer ko thôi, mà còn logic bug các thứ nữa, mà nếu nhìn xa hơn thì sẽ thấy lỗi về pointer cũng là lỗi logic cả
; Một người thì bảo nếu code chuẩn thì pointer ko thể gây ra lỗi đc, nhg cuộc đời đâu màu hồng đâu, mình code chuẩn nhg thằng dev kia lại code ko chuẩn, chính vì project quá to nên mới dễ có lỗi
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.
Con trỏ rất dễ hiểu và dễ sử dụng.
Nó rất đa dụng và toàn năng.
Bạn có thể sử dụng 1 hàm mà không cần gọi hàm đó. thậm chí phi vào giữa 1 hàm để chạy tiếp mà không cần thủ tục lằng nhằng.
Sử dụng được hết khả năng của con trỏ bạn có thể làm mọi thứ mà chương trình thể làm.
Con trỏ rất dễ hiểu và dễ sử dụng.
Nó rất đa dụng và toàn năng.
Bạn có thể sử dụng 1 hàm mà không cần gọi hàm đó. thậm chí phi vào giữa 1 hàm để chạy tiếp mà không cần thủ tục lằng nhằng.
Sử dụng được hết khả năng của con trỏ bạn có thể làm mọi thứ mà chương trình thể làm.
2 người lệch pha nhau chứ sao nữa
, một người thì thấy lỗi của pointer ( đa số lỗi bây h đều liên quan đến con trỏ hết, ko còn dạng đơn thuần BoF nữa ) nên bảo dùng pointer rất nguy hiểm, và ổng đưa ra ví dụ như chrome --> Có nhiều loại lỗi nguy hiểm ko chỉ có mỗi pointer ko thôi, mà còn logic bug các thứ nữa, mà nếu nhìn xa hơn thì sẽ thấy lỗi về pointer cũng là lỗi logic cả
; Một người thì bảo nếu code chuẩn thì pointer ko thể gây ra lỗi đc, nhg cuộc đời đâu màu hồng đâu, mình code chuẩn nhg thằng dev kia lại code ko chuẩn, chính vì project quá to nên mới dễ có lỗi
không, tôi thấy cậu kia đổ lỗi cho ngôn ngữ nó unsafe là vì có pointer, trong khi unsafe là do manual memory management với thiếu bound checking là chính chứ có phải là do pointer đâu?
2 người lệch pha nhau chứ sao nữa
, một người thì thấy lỗi của pointer ( đa số lỗi bây h đều liên quan đến con trỏ hết, ko còn dạng đơn thuần BoF nữa ) nên bảo dùng pointer rất nguy hiểm, và ổng đưa ra ví dụ như chrome --> Có nhiều loại lỗi nguy hiểm ko chỉ có mỗi pointer ko thôi, mà còn logic bug các thứ nữa, mà nếu nhìn xa hơn thì sẽ thấy lỗi về pointer cũng là lỗi logic cả
; Một người thì bảo nếu code chuẩn thì pointer ko thể gây ra lỗi đc, nhg cuộc đời đâu màu hồng đâu, mình code chuẩn nhg thằng dev kia lại code ko chuẩn, chính vì project quá to nên mới dễ có lỗi
codebase lớn, hàng ngàn thằng dev thì rủi ro tăng cao thôi.
nói chung ông chủ topic hỏi con trỏ trong c++, thì tôi thấy như đó là 1 vấn đề thường gặp.
Cách đây ko lâu đọc post của Chrome mới biết tỷ lệ lỗi lớn đến thế, (chứ đếch phải đọc ycombinator), tiện thì vào nói thôi.
chính xác thì đó là nhược điểm của memory management trong c++.
Fire Of Heart
Ở mấy cái trên tôi có nói đó là nhược điểm của pointer. Chỗ này tôi nói chưa chính xác. Đúng thì phải là nhược điểm của memory management trong c++.
lyokha114
Mấy cái trainer cho game có phải ví dụ điển hình của việc 1 process sửa data của process khác không nhỉ mấy bác
Lúc nhỏ ti toe xài thằng cheat enginer thì nhớ không nhầm cái tutorial của nó có nói về việc sửa data của process khác bằng cách trace và lấy pointer address
Mấy cái trainer cho game có phải ví dụ điển hình của việc 1 process sửa data của process khác không nhỉ mấy bác
Lúc nhỏ ti toe xài thằng cheat enginer thì nhớ không nhầm cái tutorial của nó có nói về việc sửa data của process khác bằng cách trace và lấy pointer address
Đúng rồi bác, nó còn sửa cả hàm chạy chứ không phải mỗi data :v
Mấy cái trainer cho game có phải ví dụ điển hình của việc 1 process sửa data của process khác không nhỉ mấy bác
Lúc nhỏ ti toe xài thằng cheat enginer thì nhớ không nhầm cái tutorial của nó có nói về việc sửa data của process khác bằng cách trace và lấy pointer address
lấy dc địa chỉ của 1 hàm thì mình sẽ thay hàm đó bằng 1 hàm khác mà mình tự viết rồi thay output đầu ra như mong muốn thôi, hàm cũng do con trỏ nó quản lý thì lấy ra dc địa chỉ của 1 hàm nhé
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.
Vỗ tay khen bạn nào các pro ! éo hiểu phát biểu câu này mà có công ty vẫn nhận nhở. Chẳng nhẽ ko hiểu cái máy tính nó chạy như nào ? ko hiểu tới bộ nhớ hay CPU à ? quỳ toàn tập.
Vỗ tay khen bạn nào các pro ! éo hiểu phát biểu câu này mà có công ty vẫn nhận nhở. Chẳng nhẽ ko hiểu cái máy tính nó chạy như nào ? ko hiểu tới bộ nhớ hay CPU à ? quỳ toàn tập.
mấy thím đừng quote thằng đó nữa loãng cả topic hay. Ko biết nó ngu thật hay giả ngu nhưng chưa có cái comment nào của nó ra hồn cả, ignore đi focus vào mấy pro khác tốt hơn.
mấy thím đừng quote thằng đó nữa loãng cả topic hay. Ko biết nó ngu thật hay giả ngu nhưng chưa có cái comment nào của nó ra hồn cả, ignore đi focus vào mấy pro khác tốt hơn.
có lẽ thím đó bị cuồng cỗ ăn sẵn, Cơ mà thâu không trách được. Cũng đi câu cơm cả. Cơ mà thiết nghĩ chịu khó học một chút nâng cao hiểu biết hẳn là có tội ? Thay vì lúc nào cũng tự tôn cái của mình là nhất có mệt không ?
Còn về thớt , contro đúng là khó hiểu nhưng mạnh. Ai bảo speed cho contro nhanh thì sai "tương đối" -ko hẳn sai hoàn toàn. Với OS contro hay không contro đơn giản vẫn là một biến vẫn như nhau. Bao gồm địa chỉ và giá trị , nếu thím nào hay vọc về asm thì sẽ thấy điều này rõ ràng hơn. Cái lợi của contro nó giúp người ta có thể "đi tắt", "nhảy" ...tới nơi cần tới. Vô tình trở lên nhanh hơn nhiều so với các thủ tục đầy đủ. Miêu tả như vậy kể ra cũng ko chính xác lắm....
Cơ mà câu cuối muốn nhắc một số bạn , CPU chỉ làm việc với địa chỉ mà thôi
Còn giờ C++ cũng ra thêm nhiều ver rồi, mỗi ver tiến bộ một chút. Để mục đích cải thiện một số vấn đề còn tồn tại - Công bằng mà nói. Ngôn ngữ ko có lỗi , lỗi do người code. Tuy nhiên người dev lại ko phải thánh , người phàm thân người. Cái việc ko hoàn hảo luôn có , nhất trong cái " tơ vò" của đám trỏ trỏ ...trỏ cái lol. Thfi điều ấy càng nhiều , việc có vài giải pháp hạn chế những lúc ngáp ngủ - năng lượng thấp trí não là cần thiết.
Các thím ko cần quá đà vào việc tranh cãi làm gì ? Chẳng ai bỏ được con trỏ đâu ...
naiveryan
Dạo này box cntt sôi nổi thế.
Hóng kèo đánh lộn.
Cmt dài dài tí ít ra có tí chút mở mang, chứ có vài thanh niên chuyên đi thả bait thì ignore cho lẹ đi mấy đại hiệp, quote lại làm gì tốn băng thông. Nói thẳng ra là thanh niên dangmt với callmeoo gì đó, ko đóng góp đc gì thì cũng chửi nhau mạnh vào rồi ăn ban cho đẹp chứ nhỉ.
botmingoc
Vậy tóm tắt lợi ích của việc dùng con trỏ:
- Cùng ngôn ngữ với tầng dưới, được support nhiều đỡ mất công phải wrapper.
- Khi gọi hàm qua lại các kiểu thì truyền địa chỉ chứ ko truyền cả 1 cục memory block đấy -> tiết kiệm hơn.
- fast iterator: chơi kiểu &pointer ++ vì biết các phần tử của mảng nó ở gần nhau trong bộ nhớ.
Còn gì nữa ko các thím, mình từ ngôn ngữ ko có con trỏ (Java) đang ngồi học code c/c++ nên tò mò tì. Mấy cái "đi tắt" "nhảy" các thím có thể cho vài ví dụ được không, việc đấy có được hay dùng vào production code không hay là bộ môn trình diễn hacky thôi?
Last edited:
lamquangminh
Hiện tại con trỏ C++ có một điểm mạnh hơn hết các ngôn ngữ khác là tự quản lý vùng nhớ do mình tạo ra
Nhược điểm của nó là do tự quản lý nên có thể truy xuất bậy bạ vào chổ khác(và đây là nhược điểm khủng bố nhất của con trỏ gây ra biết bao đau thương cho anh em nhà dev)
Cmt dài dài tí ít ra có tí chút mở mang, chứ có vài thanh niên chuyên đi thả bait thì ignore cho lẹ đi mấy đại hiệp, quote lại làm gì tốn băng thông. Nói thẳng ra là thanh niên dangmt với callmeoo gì đó, ko đóng góp đc gì thì cũng chửi nhau mạnh vào rồi ăn ban cho đẹp chứ nhỉ.
Đánh lộn gì đâu. Mới sáng sớm ra nó bảo post của mình toàn "cứt" lại chả cáu.
Chứ nói chuyện đàng hoàng thì ai nói gì. Đúng sai là bình thường, ai cũng có quyền lên tiếng và phát biểu cả. Tôi cũng chả dám bảo tôi nói cái gì cũng đúng.
Hiện tại con trỏ C++ có một điểm mạnh hơn hết các ngôn ngữ khác là tự quản lý vùng nhớ do mình tạo ra
Nhược điểm của nó là do tự quản lý nên có thể truy xuất bậy bạ vào chổ khác(và đây là nhược điểm khủng bố nhất của con trỏ gây ra biết bao đau thương cho anh em nhà dev)
Hoặc là quên giải phóng sau khi sử dụng xong !
"Tự quản lý vùng nhớ" á, how? Tưởng cấp phát mem là chuyện khác chứ?
"Tự quản lý vùng nhớ" á, how? Tưởng cấp phát mem là chuyện khác chứ?
Ohm, mình hiểu câu nói của bạn, nhưng ý mình đặc thù con trỏ trong C/C++ nó đi chung với việc dính dáng tới bộ nhớ
Chứ còn nói con trỏ chung chung thì ngôn ngữ nào chẳng có con trỏ, thậm chí C#, Java làm việc hoàn toàn 100% là trên con trỏ đó !!!
zulu
Thôi đi bác thằng Nipin đó thì nói làm j. Tiêu chuẩn kép vl.
Đánh lộn gì đâu. Mới sáng sớm ra nó bảo post của mình toàn "cứt" lại chả cáu.
Chứ nói chuyện đàng hoàng thì ai nói gì. Đúng sai là bình thường, ai cũng có quyền lên tiếng và phát biểu cả. Tôi cũng chả dám bảo tôi nói cái gì cũng đúng.
cậu có biết Ada nó ra đời từ năm 1980 không? hay lisp machine, SECD machine các kiểu còn sớm hơn đều safety by default hết. tôi đọc bài của cậu thấy nói cứ như là ngày xưa nó gà nó đíu biết security là gì cho nên mới có pointer, đéo chửi hơi phí.
thêm nữa pointer chỉ là một cách để represent data, các bạn học hành đíu tử tế chỉ thấy cần khai báo pointer khi cần dynamic allocate memory (dùng malloc/calloc hay new) rồi nhầm lẫn mẹ sang memory management (vì mấy cái malloc calloc nó sẽ trả về pointer sau khi gọi), thế là đổ hết lỗi sang pointer, hài đéo thể hài hơn.
mà pointer hay memory management là low level concept, các bạn thấy trình không đủ thì dùng ngôn ngữ hoặc thư viện nó giúp quản lý memory hộ (raii, gc, borrow checker) thì cũng chả sai, vấn đề là các bạn phải biết là bên dưới nó vẫn là pointer hết, chẳng qua là có người khác check hết lỗi cho bạn thôi, chứ nhiều thằng cứ nói như là pointer là cấu trúc sai lầm cần phải cấm tiệt (giống goto) nghe chỉ muốn đấm vào mặt.
Fire Of Heart
Ngày trước tôi đi phỏng vấn 1 anh. Anh ấy cũng khá pro.
Khi nói chuyện, anh ấy chỉ bảo là mình chỉ trao đổi thôi, có những cái có thể anh biết hoặc anh ko biết.
Thực sự cá nhân tôi rất thích những người như vậy. Họ khiêm tốn vì họ biết kiến thức của mỗi người là hữu hạn.
Cá nhân tôi cũng thế.
Ủa rồi vì tôi kiến thức hữu hạn rồi ngồi chửi cứt đái này nọ, rồi đòi đánh đấm?
Các bạn biết Linus chứ? Bình thường ổng cũng rất toxic.
https://www.zdnet.com/article/linux...alds-over-abuse-quits-toxic-kernel-community/ 1 dòng code lỗi thôi, ông ấy viết 1 cái email dài 1 trang A4 để chửi, shit này shit nọ.
Đến mức có người phải bỏ công việc vì ko chịu dc sự toxic. Nếu ko phải vì ổng là Linus chắc đã bị đuổi rất lâu.
Và sau này, ổng ấy đã hiểu dc sự toxic của mình là ko hay.
On Sunday, he apologized for years of improper behavior. "My flippant attacks in emails have been both unprofessional and uncalled for," Torvalds wrote in an
email to the Linux kernel mailing list. "I know now this was not OK and I am truly sorry."
Tôi post chơi thôi, ai nghĩ gì thì nghĩ.
Cá nhân tôi, tôi thích môi trường văn minh, lành mạnh, lịch sự.
Đừng quote tôi nếu trái ý, ko rảnh tiếp!
Supersoyx
Pointer trong lập trình ứng dụng thì ko còn cần thiết nữa nhưng mà nó vẫn còn hữu dụng đối với tính toán tốc độ cao. Pointer cho phép dùng 1 địa chỉ vùng nhớ theo ý thích. Mà cái này hay vãi đấy.
Fire Of Heart
Ngày xưa, khi phát triển C++, lúc đó cái quan tâm nhất là performance:
1. Làm sao để access nhanh nhất vào hardware.
2. Làm sao để tiết kiệm cũng như tối ưu memory + runtime.
3. Tương thích với C.
Cho nên khi đó, C++ là unsafe.
Đến sau này, với sự phát triển của phần cứng, thì performance nó ko phải là cái ưu tiên nữa, mà là security. Nên các phiên bản sau này mới phải phát triển ra smart pointer (1 class wrapper lại raw pointer).
Nói thế để hiểu, tư duy mỗi thời kỳ nó khác.
Trong môi trường phát triển phần mềm, multithread, những cục source code mấy chục GB thì ở đó mà check hết cái raw pointer cho hết lỗi thế đéo nào dc!
Và thực tế Google/M$ là 1 ví dụ điển hình.
Dm đến bản thân tôi khi biết mấy tin này cũng còn giật mình vì đéo nghĩ là nó nhiều đến thế.
Thế nên tốt nhất là, trong môi trường phát triển phần mềm, cấm mẹ hết mấy cái raw pointer, goto đi là khỏe biết bao nhiêu việc :sogood:
Last edited:
Nix
^ thì ông Nipin dẫn ra 1 đống ngôn ngữ như Ada, Lisp,.. đc phát triển cùng thời với C++ mà vẫn safe đấy thôi...ông nói kiểu thời 7x 8x all ngôn ngữ đều đc viết unsafe thì ăn gạch đúng rồi chứ gì nữa mà trigger
Ngày xưa, khi phát triển C++, lúc đó cái quan tâm nhất là performance:
1. Làm sao để access nhanh nhất vào hardware.
2. Làm sao để tiết kiệm cũng như tối ưu memory + runtime.
3. Tương thích với C.
Cho nên khi đó, C++ là unsafe.
Đến sau này, với sự phát triển của phần cứng, thì performance nó ko phải là cái ưu tiên nữa, mà là security. Nên các phiên bản sau này mới phải phát triển ra smart pointer (1 class wrapper lại raw pointer).
Nói thế để hiểu, tư duy mỗi thời kỳ nó khác.
Trong môi trường phát triển phần mềm, multithread, những cục source code mấy chục GB thì ở đó mà check hết cái raw pointer cho hết lỗi thế đéo nào dc!
Và thực tế Google/M$ là 1 ví dụ điển hình.
Dm đến bản thân tôi khi biết mấy tin này cũng còn giật mình vì đéo nghĩ là nó nhiều đến thế.
Thế nên tốt nhất là, trong môi trường phát triển phần mềm, cấm mẹ hết mấy cái raw pointer, goto đi là khỏe biết bao nhiêu việc :sogood:
Raw pointer không bao giờ bỏ đi được nhất là xử lý tốc độ cao, như mấy cái engine đồ họa 3D chắc chắn dùng pointer nhiều, chứ dùng cấp phát và thu hồi memory cho từng biến thì máy nào đỡ nổi.
^ thì ông Nipin dẫn ra 1 đống ngôn ngữ như Ada, Lisp,.. đc phát triển cùng thời với C++ mà vẫn safe đấy thôi...ông nói kiểu thời 7x 8x all ngôn ngữ đều đc viết unsafe thì ăn gạch đúng rồi chứ gì nữa mà trigger
chính xác hơn thì ban đầu nó là safe, unsafe ra sau rồi lấn át do performance vượt trội. sau nữa thì hardware nó cũng optimize theo cái unsafe này => performance càng tăng.
^ thì ông Nipin dẫn ra 1 đống ngôn ngữ như Ada, Lisp,.. đc phát triển cùng thời với C++ mà vẫn safe đấy thôi...ông nói kiểu thời 7x 8x all ngôn ngữ đều đc viết unsafe thì ăn gạch đúng rồi chứ gì nữa mà trigger
Nguyên văn câu của mình:
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á
-----> Cho mình hỏi, chỗ nào mình bảo
all ngôn ngữ unsafe. Đừng nhét chữ vào mồm mình bạn ơi.
Nipin
kể ra thì nếu cái cậu fire of heart kia đơn giản bảo là giờ c++ có nhiều cách khác hiệu quả an toàn hơn là dùng raw pointer thì chả ai gạch. Đằng này lôi mấy cái đíu liên quan vào chửi pointer, rồi chửi luôn mấy lão language designer thiết kế ngu do thiếu hiểu biết trong khi thực tế là computer science theory nó từ thập niên 70 80 nó đã gần như lên top rồi, bây giờ còn chưa ứng dụng dc hết mớ nghiên cứu từ thời đó.
Fire Of Heart
Lại nhét chữ vào mồm người khác.
Hỏi thật nha, đọc hiểu cái post của tôi có vấn đề ko vậy? Chỗ nào tôi bảo ng ta thiếu hiểu biết. Tôi đã nói rất rõ là thời điểm đó "ng ta ko ưu tiên các vấn đề này lên hàng đầu", mà ưu tiên hồi đó là performance.
Ủa sao cứ thích nhét chữ vào mồm ng khác thế nhỉ?
Mà memory management ko liên quan tới pointer? Lỗ hổng do sử dụng pointer ko đúng cách thì ko liên quan tới pointer?
Last edited:
Fire Of Heart
Mỗi thời điểm nó sẽ có những lựa chọn khác nhau.
Tôi chả phê phán gì những ng phát triển ngôn ngữ thời kỳ đó cả. còn rất nể họ.
Thời kỳ đó hardware còn chưa mạnh thì phải chú ý vào performance thôi, sau này hardware mạnh, giá rẻ hơn thì lúc này ng ta có thể ưu tiên những thứ khác mà ngày xưa chư ưu tiên.
Tôi nói vậy vẫn còn nói nữa tôi cũng chịu. Mệt thật!
Nipin
một thằng hiểu sai thì là do vấn đề của thằng đọc hiểu, nhiều thằng hiểu sai thì các bạn cũng biết vấn đề thuộc về ai rồi đấy.
nếu thấy người ta hiểu sai ý của mình thì đơn giản bảo "thực ra tôi muốn nói là thế này", chứ đéo phải là sửng cồ lên chửi đổng, rồi bị đập mặt xong mới bảo "thực ra ý của tôi là khác", lúc đấy đéo ai care.
mà thôi tôi cũng lười tiếp, với mấy thằng dạng này thì thế đéo nào nó chả nói được. nói chung cãi nhau cho vui thì thích chơi nguỵ biện kiểu đíu gì chả được, tôi cũng chả phải là vô tội (cậu gì ở trên nói tiêu chuẩn kép cũng chả sai), cơ mà vào thảo luận kiến thức thì phải nói cho rõ ràng ra để hiểu được cho chính xác, chứ ngồi chăm chăm cái ego thì được cái kẹc gì?
tôi hỏi thật các bạn khác, ở đây bao nhiêu người đọc bài đầu của cậu fire of heart rồi sinh ra ấn tượng ban đầu là "ờ hoá ra pointer là cái thiết kế ngu xuẩn ngày xưa giờ lỗi thời rồi đừng có dùng"?
p.s: nhân tiện thì làm tôi nhớ đến chuyên ở topic khác có vài bạn nói tôi post bài toàn dài lê thê, ờ tôi viết bài dài vì tôi sợ người ta hiểu nhầm ý tôi, sợ kiến thức tôi đưa ra không đủ chuẩn xác, thấy người ta chê thì cũng giật mình thon thót google cả nửa tiếng rồi mới dám chửi lại, nói chung ít nhất thì tôi còn tự tin là nếu tôi đọc hiểu không sai thì ít nhất bài viết của tôi đều diễn đạt được ý của mình muốn nói, các bạn (đặc biệt là các bạn newbie) có thể yên tâm mà đọc.
Fire Of Heart
Uh thảo luận kiến thức thì ok thôi. Tôi ko phản đối. Nếu sai thì tôi giải thích lại, hoặc nhận sai là bình thường.
Nếu ở cái post đầu tiên, các anh thấy tôi ghi ko rõ, ok tôi nhận là tôi ghi ko chính xác luôn và giải thích lại.
Đây mới vào anh bảo
"post toàn shit mà đéo rảnh để nói" ơ thế thì gọi là thảo luận cái gì nhỉ?
Anh nói tôi nghe nó có thảo luận cái gì trong đấy, lại đi bảo ng ta sửng cồ lên chửi đổng?
Ủa thế sao ko nhìn lại bản thân mình đã đàng hoàng với ng khác chưa mà muốn ng khác đàng hoàng với mình?
kể ra thì nếu cái cậu fire of heart kia đơn giản bảo là giờ c++ có nhiều cách khác hiệu quả an toàn hơn là dùng raw pointer thì chả ai gạch. Đằng này lôi mấy cái đíu liên quan vào chửi pointer, rồi chửi luôn mấy lão language designer thiết kế ngu do thiếu hiểu biết trong khi thực tế là computer science theory nó từ thập niên 70 80 nó đã gần như lên top rồi, bây giờ còn chưa ứng dụng dc hết mớ nghiên cứu từ thời đó.
Lý thuyết khoa học máy tính hồi năm 80 khá lạc hậu. Mình không biết bạn nghĩ gì. Nhưng các lập trình viên bây giờ không nhất thiết phải ứng dụng hết các nghiên cứu từ thời đó. Chỉ cần ứng dụng các kết quả là được. Kể cả các lập trình viên Google khi đi làm cũng ít đụng tới thuật toán. Đỉnh cao của KHMT bây giờ là Deep learning với mạng nơ ron. Đây là lĩnh vực vẫn chỉ đang phát triển. Mà thời năm 80 nó làm gì có hướng đối tượng. Mấy cái lý thuyết hồi năm 80 mà còn nghĩ nó cao siêu thì khó mà lên trình được.
hopevnn
Thằng Nipin toàn đi search trên mấy cái forum tiếng Anh rồi về chém gió chứ có hiểu bản chất quái đâu, lại còn kêu cấm tiệt goto, WTF?
Uh thảo luận kiến thức thì ok thôi. Tôi ko phản đối. Nếu sai thì tôi giải thích lại, hoặc nhận sai là bình thường.
Nếu ở cái post đầu tiên, các anh thấy tôi ghi ko rõ, ok tôi nhận là tôi ghi ko chính xác luôn và giải thích lại.
Đây mới vào anh bảo
"post toàn shit mà đéo rảnh để nói" ơ thế thì gọi là thảo luận cái gì nhỉ?
Anh nói tôi nghe nó có thảo luận cái gì trong đấy, lại đi bảo ng ta sửng cồ lên chửi đổng?
Ủa thế sao ko nhìn lại bản thân mình đã đàng hoàng với ng khác chưa mà muốn ng khác đàng hoàng với mình?
anh có thể bảo là "hôm nay mood tôi không tốt" chả lẽ tôi cũng không thể có mood? nói chung tôi đang sẵn khó chịu vì ở trong box có rất nhiều người hiểu sai cơ bản, cho nên thấy có thằng vào nói mấy câu đúng kiểu anecdotal thì tôi chửi thôi.
Lý thuyết khoa học máy tính hồi năm 80 khá lạc hậu. Mình không biết bạn nghĩ gì. Nhưng các lập trình viên bây giờ không nhất thiết phải ứng dụng hết các nghiên cứu từ thời đó. Chỉ cần ứng dụng các kết quả là được. Kể cả các lập trình viên Google khi đi làm cũng ít đụng tới thuật toán. Đỉnh cao của KHMT bây giờ là Deep learning với mạng nơ ron. Đây là lĩnh vực vẫn chỉ đang phát triển. Mà thời năm 80 nó làm gì có hướng đối tượng. Mấy cái lý thuyết hồi năm 80 mà còn nghĩ nó cao siêu thì khó mà lên trình được.
Thằng Nipin toàn đi search trên mấy cái forum tiếng Anh rồi về chém gió chứ có hiểu bản chất quái đâu, lại còn kêu cấm tiệt goto, WTF?
ờ, ở đây tôi nói vụ cấm tiệt goto, là muốn nói đến chuyện các bạn lúc mới học đến goto thì hầu như thầy giáo nào cũng bảo goto is bad, never uses goto in your code. thực ra thì cái này cũng không sai, nhu cầu thông thường thì chả cần goto cũng chả nên dùng goto. nhưng mà với vài thằng thế giới chỉ có đen với trắng, đi search code base của mấy thằng như linux kernel, gcc; thấy nó dùng goto liền nhảy vào chê chửi này nọ. tôi thấy chả khác vẹo gì phản ứng của các bạn về pointer trong trường hợp này.
// đợi mãi cuối cùng cũng có người thắc mắc về cái goto, cám ơn bạn đã không làm tôi thất vọng.
Lý thuyết khoa học máy tính hồi năm 80 khá lạc hậu. Mình không biết bạn nghĩ gì. Nhưng các lập trình viên bây giờ không nhất thiết phải ứng dụng hết các nghiên cứu từ thời đó. Chỉ cần ứng dụng các kết quả là được. Kể cả các lập trình viên Google khi đi làm cũng ít đụng tới thuật toán. Đỉnh cao của KHMT bây giờ là Deep learning với mạng nơ ron. Đây là lĩnh vực vẫn chỉ đang phát triển. Mà thời năm 80 nó làm gì có hướng đối tượng. Mấy cái lý thuyết hồi năm 80 mà còn nghĩ nó cao siêu thì khó mà lên trình được.
Lạc cmm chứ lạc, phát biểu ncc
Deep Learning hay neutron cmg cũng phải dựa vào nền tảng của KHMT hiện tại nhé, trừ máy tính lượng tử ra thôi, đỉnh cmm chứ đỉnh.
"Nhưng các lập trình viên bây giờ không nhất thiết phải ứng dụng hết các nghiên cứu từ thời đó" -> nói như m thì khỏi cần nghiên cứu nền tảng driver framework OS hay ví dụ gần đây là Ray Tracing nữa, mà chỉ cần ứng dụng mấy cái game engine sẵn có để làm game mãi thôi àh? Nói như m thì giờ vẫn còn MS-Dos chứ lấy chó đâu ra 2D 3D game cho mày chơi?
Biết thì thưa thốt, del biết thì ngậm mẹ mồm lại cho 2 thánh kia chém.
Lý thuyết khoa học máy tính hồi năm 80 khá lạc hậu. Mình không biết bạn nghĩ gì. Nhưng các lập trình viên bây giờ không nhất thiết phải ứng dụng hết các nghiên cứu từ thời đó. Chỉ cần ứng dụng các kết quả là được. Kể cả các lập trình viên Google khi đi làm cũng ít đụng tới thuật toán. Đỉnh cao của KHMT bây giờ là Deep learning với mạng nơ ron. Đây là lĩnh vực vẫn chỉ đang phát triển. Mà thời năm 80 nó làm gì có hướng đối tượng. Mấy cái lý thuyết hồi năm 80 mà còn nghĩ nó cao siêu thì khó mà lên trình được.
Như cái neural network thì cũng đã có từ xưa, nhưng thời đó, phần cứng bị giới hạn nên ko phát triển ra ứng dụng dc. Với lại khi đó data thì không có nhiều.
Khoảng từ cách đây hơn 20 năm (ko nhớ chính xác chỗ này), khi phần cứng phát triển mạnh hơn, rẻ hơn, và data trở nên nhiều khủng khiếp, thì lúc đó bắt đầu quan tâm tới machine learning, neural network lúc này dc chú ý lại.
Bảo 20 năm nhưng mình từ tầm 2005-2010 mới bắt đầu dc chú ý nhiều. Còn trước đó có nhưng cũng chỉ rải rác.
Còn cái đoạn nói về ko ứng dụng hết các nghiên cứu từ thời 80 + Google đi làm ít đụng thuật toán thì mình nghĩ bạn nên coi lại.
Tôi nói ví dụ mấy cái hash table, nó dc nghiên cứu từ hồi 70-80 đó, ko nhớ lắm, để lát tôi lục lại.
Còn thuật toán thì tùy nơi, ko thể bảo là ít hay nhiều dc. Nếu ở VN mình ít sử dụng, thì đó là do tính chất công việc chưa tới, chỉ cần xài hàm có sẵn! Nhưng như thế ko có nghĩa là nó ít!
Nhiều cái lý thuyết nó vẫn dc xài và sử dụng rất tốt ở thời điểm bây giờ.
Cái hash table này, nó vẫn dc dạy cơ bản ở các trường đại học. Các implement khác cũng base trên 2 cái này. Paper gốc thì trong wiki có đó.
Nói vậy để bạn hiểu kiến thức nền tảng, có thể cũ nhưng luôn giá trị.
MIT nó có course algorithm, dạy rất kỹ mấy cái này, ai muốn bổ sung thì nên học.
L1f3 ver 2
vl vẫn chưa hết cái để nói à
, chuyển qua chủ đề khác đi mấy fen
, quay đi quay lại lại bàn về lịch sử rồi chứ chả thêm kiến thức nào ...
Nipin
nói đến giờ ít khi đụng đến thuật toán kể cũng không sai, nhưng đấy là bởi vì... đa số các thuật toán quan trọng đều đã được phát minh vào những năm 7x rồi, cũng đã được implement tới gần hoàn thiện rồi, các bạn chỉ việc đem vào dùng thì hiển nhiên là không cần động đến thuật toán
flowerfx2
giờ vẫn chửi nhau à, hóng kèo xiên nhau
cba
Mới lập topic được 2 ngày mà các bạn đã tràn vào gần chục page rồi. Thảo luận gay cấn quá và hay nữa
nói đến giờ ít khi đụng đến thuật toán kể cũng không sai, nhưng đấy là bởi vì... đa số các thuật toán quan trọng đều đã được phát minh vào những năm 7x rồi, cũng đã được implement tới gần hoàn thiện rồi, các bạn chỉ việc đem vào dùng thì hiển nhiên là không cần động đến thuật toán
Thuật toán cơ bản gần như đã đầy đủ. Còn những thuật toán cao cấp hơn thì vẫn đang được phát minh tuy nhiên ứng dụng của nó lại không dành cho đại trà. Một số thuật toán của ngành y chẳng hạn.
Deep Learning hay neutron cmg cũng phải dựa vào nền tảng của KHMT hiện tại nhé, trừ máy tính lượng tử ra thôi, đỉnh cmm chứ đỉnh.
"Nhưng các lập trình viên bây giờ không nhất thiết phải ứng dụng hết các nghiên cứu từ thời đó" -> nói như m thì khỏi cần nghiên cứu nền tảng driver framework OS hay ví dụ gần đây là Ray Tracing nữa, mà chỉ cần ứng dụng mấy cái game engine sẵn có để làm game mãi thôi àh? Nói như m thì giờ vẫn còn MS-Dos chứ lấy chó đâu ra 2D 3D game cho mày chơi?
Biết thì thưa thốt, del biết thì ngậm mẹ mồm lại cho 2 thánh kia chém.
"Kể cả các lập trình viên Google khi đi làm cũng ít đụng tới thuật toán"
đọc câu này thì ignore đc rồi...gõ chi dài vậy ba
"Kể cả các lập trình viên Google khi đi làm cũng ít đụng tới thuật toán"
đọc câu này thì ignore đc rồi...gõ chi dài vậy ba
Kỹ sư Google hay FB dùng tới thuật toán cực kỳ nhiều. Xem mấy món opensource của FB, GG là thấy ngay.
lyokha114
Lúc chiều gặp cái task viết lại phần tính toán nợ, sử dụng thuật toán đơn hình trong quy hoạch tuyến tính theo yêu cầu khách hàng. Hoảng hồn vì ứ biết nó là gì
Nhớ lúc học đại số tuyến tính hình như không có phần này (hay do ăn chơi không học hay quên mất xừ nó rồi
)
Google ra toán bên kinh tế, đọc lý thuyết xong lập phương trình với điều kiện rồi gọi hàm bên apache common math là xong
Lý thuyết khoa học máy tính hồi năm 80 khá lạc hậu. Mình không biết bạn nghĩ gì. Nhưng các lập trình viên bây giờ không nhất thiết phải ứng dụng hết các nghiên cứu từ thời đó. Chỉ cần ứng dụng các kết quả là được. Kể cả các lập trình viên Google khi đi làm cũng ít đụng tới thuật toán. Đỉnh cao của KHMT bây giờ là Deep learning với mạng nơ ron. Đây là lĩnh vực vẫn chỉ đang phát triển. Mà thời năm 80 nó làm gì có hướng đối tượng. Mấy cái lý thuyết hồi năm 80 mà còn nghĩ nó cao siêu thì khó mà lên trình được.
Cạn lời với ông này . Ông có lẽ đúng mãi chỉ là một công nhân code theo đúng nghĩa đen luôn. Việc ông học , có kiến thức gốc ông mới cải tiến. Sáng tạo ra cái mới , ko phải đùng phát tự nhiên ông phát minh ra điều gì mới mẻ. Cho dù táo hay dừa rơi vào đầu thì vẫn chỉ mãi vậy.
Còn ông có để ý rất nhiều thứ bây giờ bắt nguồn từ ngày đó ko muốn nói từ 99% cmn. Từ AI cho đến all ... Đã nhiều thứ ngày đó người ta stop , bây giờ còn back lại vì thấy phù hợp với hoàn cảnh thực tế.
Éo hiểu sao có người khuyên không học mấy cái gốc , còn vẫn muốn nói một câu. CPU chỉ làm việc với địa chỉ , kiểu như có mặt trời ắt có ánh nắng. Các ông ko cần nhưng không phải tất cả cùng vậy.
ChuaBaoGioRaDao
Cảm ơn các pro đã cho em sáng mắt ra
đọc thread này sướng tê cả người...
Vậy tóm tắt lợi ích của việc dùng con trỏ:
- Cùng ngôn ngữ với tầng dưới, được support nhiều đỡ mất công phải wrapper.
- Khi gọi hàm qua lại các kiểu thì truyền địa chỉ chứ ko truyền cả 1 cục memory block đấy -> tiết kiệm hơn.
- fast iterator: chơi kiểu &pointer ++ vì biết các phần tử của mảng nó ở gần nhau trong bộ nhớ.
Còn gì nữa ko các thím, mình từ ngôn ngữ ko có con trỏ (Java) đang ngồi học code c/c++ nên tò mò tì. Mấy cái "đi tắt" "nhảy" các thím có thể cho vài ví dụ được không, việc đấy có được hay dùng vào production code không hay là bộ môn trình diễn hacky thôi?
Truyền địa chỉ thì tất cả ngôn ngữ đều truyền được. Fast iterator cũng ko đúng vì addr cộng lên 1 hay 100 cũng như nhau thôi. Các ngôn ngữ như java dùng safe reference là con trỏ không thể truy suất ngoài vùng nhớ của 1 object. Pointer truy suất địa chỉ bất kì. Ví dụ có 2 số nguyên 32 bit ta có thể dùng lại nó như 1 số nguyên 64 bit như vậy ko cần xóa đi đối tượng cũ và cấp phát lại đối tựơng mới . Trong xử lý dữ liệu lớn như đồ họa 3d chẳng hạn. Mọi dữ liệu đều là array khổng lồ. Buộc phải tham chiếu đến từng địa chỉ để xử lí từng điểm ảnh, từng đa giác...nói chung dù lập trình ko cần pointer nhưng hiểu pointer sẽ giúp mình hiểu cách thức vận hành của 1 chương trình.
pepguard-violon
ưu điểm của pointer là nó dc cấp phát bộ nhớ động, yêu cầu người lập trình phải nắm vững nguyên tắc quản lý bộ nhớ.
thì nó sẽ nhanh, đỡ tốn bộ nhớ hơn là cấp phát tĩnh. Do đó nói nó ko có ưu điểm là ko đúng nè. Nhược điểm là khó nếu ko quen cách quản lý, ko biết thuật toán, dễ gây bug.
Ví dụ ở ngôn ngữ swift, nó dẹp luôn cái pointer, nhưng vì là ngôn ngữ an toàn, nên quản lý bộ nhớ đã có xcode, code sai là ko chạy, chứ ko có vụ chạy mà bug. Tức là từ đầu, trong trứng nước nó đã làm giúp dev việc đó.
Truyền địa chỉ thì tất cả ngôn ngữ đều truyền được. Fast iterator cũng ko đúng vì addr cộng lên 1 hay 100 cũng như nhau thôi. Các ngôn ngữ như java dùng safe reference là con trỏ không thể truy suất ngoài vùng nhớ của 1 object. Pointer truy suất địa chỉ bất kì. Ví dụ có 2 số nguyên 32 bit ta có thể dùng lại nó như 1 số nguyên 64 bit như vậy ko cần xóa đi đối tượng cũ và cấp phát lại đối tựơng mới . Trong xử lý dữ liệu lớn như đồ họa 3d chẳng hạn. Mọi dữ liệu đều là array khổng lồ. Buộc phải tham chiếu đến từng địa chỉ để xử lí từng điểm ảnh, từng đa giác...nói chung dù lập trình ko cần pointer nhưng hiểu pointer sẽ giúp mình hiểu cách thức vận hành của 1 chương trình.
Thế tóm lại thím show ra 1 vài samples code được không? Mình đã post là mới học, mấy cái ưu điểm toàn quote lại từ những post trước, mà hỏi show samples mãi ko thấy ai nói gì. Ví dụ với đoạn: 2 số nguyên 32 bit gộp lại thành 64 bit là kiểu gì, nếu nó ko thuộc 2 memory blocks gần/ không gần nhau thì sao, tự quản lý ghép/nhập bits bằng code manual á?
Cái đoạn "mọi dữ liệu đều là array khổng lồ..." thím có thể show ra luồng code được coi là thế mạnh của ngôn ngữ dùng con trỏ được không, mình sẽ cố thử so sánh tới ngôn ngữ ko dùng (gọi là giấu hoặc là tự động hoặc là an toàn abcxyz gì cũng được)
Thế tóm lại thím show ra 1 vài samples code được không? Mình đã post là mới học, mấy cái ưu điểm toàn quote lại từ những post trước, mà hỏi show samples mãi ko thấy ai nói gì. Ví dụ với đoạn: 2 số nguyên 32 bit gộp lại thành 64 bit là kiểu gì, nếu nó ko thuộc 2 memory blocks gần/ không gần nhau thì sao, tự quản lý ghép/nhập bits bằng code manual á?
Cái đoạn "mọi dữ liệu đều là array khổng lồ..." thím có thể show ra luồng code được coi là thế mạnh của ngôn ngữ dùng con trỏ được không, mình sẽ cố thử so sánh tới ngôn ngữ ko dùng (gọi là giấu hoặc là tự động hoặc là an toàn abcxyz gì cũng được)
Mình đã bảo là con trỏ nó không có ưu điểm nào mà. Mấy thánh ở trên toàn chém gió đó mà. Nếu có ưu điểm thật thì đã show được mã code rồi. Sử dụng 1 thứ mà nó quá khó hiểu thì nên loại bỏ là tốt nhất.
Thế tóm lại thím show ra 1 vài samples code được không? Mình đã post là mới học, mấy cái ưu điểm toàn quote lại từ những post trước, mà hỏi show samples mãi ko thấy ai nói gì. Ví dụ với đoạn: 2 số nguyên 32 bit gộp lại thành 64 bit là kiểu gì, nếu nó ko thuộc 2 memory blocks gần/ không gần nhau thì sao, tự quản lý ghép/nhập bits bằng code manual á?
Cái đoạn "mọi dữ liệu đều là array khổng lồ..." thím có thể show ra luồng code được coi là thế mạnh của ngôn ngữ dùng con trỏ được không, mình sẽ cố thử so sánh tới ngôn ngữ ko dùng (gọi là giấu hoặc là tự động hoặc là an toàn abcxyz gì cũng được)
Case này hơi đặc thù tí cơ mà ko biết mình cùi bắp hay sao mà ngày trc em gặp vấn đề như thế này: em sử dụng java và muốn xài 1 hàm từ thư viện hệ thống bên ngoài ( native library ý ). Ta có thể sử dụng System.loadLibrary() , tuy nhiên thì đen cái là thư viện đó strip hết các symbol nên gọi bình thường ko đc
, nhg em vẫn biết địa chỉ của hàm đó nhờ dissembly cái thư viện ra. Hồi đó ko biết làm thế nào để gọi, phải đổi toàn bộ qua python rồi dùng ctypes cast về con trỏ rồi gọi
Case này hơi đặc thù tí cơ mà ko biết mình cùi bắp hay sao mà ngày trc em gặp vấn đề như thế này: em sử dụng java và muốn xài 1 hàm từ thư viện hệ thống bên ngoài ( native library ý ). Ta có thể sử dụng System.loadLibrary() , tuy nhiên thì đen cái là thư viện đó strip hết các symbol nên gọi bình thường ko đc
, nhg em vẫn biết địa chỉ của hàm đó nhờ dissembly cái thư viện ra. Hồi đó ko biết làm thế nào để gọi, phải đổi toàn bộ qua python rồi dùng ctypes cast về con trỏ rồi gọi
Hay vậy, nhưng địa chỉ hàm đấy nó fix hay sao mà thím chạy được, nếu mang code sang máy khác thì chạy đc ko hay mỗi lần chạy thím lại có code dò lại địa chỉ hàm đấy?
Mình đã bảo là con trỏ nó không có ưu điểm nào mà. Mấy thánh ở trên toàn chém gió đó mà. Nếu có ưu điểm thật thì đã show được mã code rồi. Sử dụng 1 thứ mà nó quá khó hiểu thì nên loại bỏ là tốt nhất.
Hay vậy, nhưng địa chỉ hàm đấy nó fix hay sao mà thím chạy được, nếu mang code sang máy khác thì chạy đc ko hay mỗi lần chạy thím lại có code dò lại địa chỉ hàm đấy?
Địa chỉ hàm fix là offset của nó so với base của thư viện fix thôi, còn khi load lên từ 1 chương trình khác thì sẽ có base khác --> địa chỉ khác. Việc này các hàm load nó đã handle cho mình rồi nên mang sang máy khác vẫn ok thôi
Địa chỉ hàm fix là offset của nó so với base của thư viện fix thôi, còn khi load lên từ 1 chương trình khác thì sẽ có base khác --> địa chỉ khác. Việc này các hàm load nó đã handle cho mình rồi nên mang sang máy khác vẫn ok thôi
Xịn, offset của hàm đấy trong thư viện thím biết, còn base thì lấy từ thư viện load. Đấy là cách làm cũng hơi hacky nhỉ? Team mình cũng có phần dưới code c nhưng dùng Djinni của dropbox để tạo API cho tầng java trên dùng
Xịn, offset của hàm đấy trong thư viện thím biết, còn base thì lấy từ thư viện load. Đấy là cách làm cũng hơi hacky nhỉ? Team mình cũng có phần dưới code c nhưng dùng Djinni của dropbox để tạo API cho tầng java trên dùng
À thì ...
, biết sao giờ, khách nó đã strip symbol đi tức là ko muốn người ngoài dùng rồi, cơ mà mình "cần" nó thì đành phải đi đường ma đạo thôi
. Đúng rồi thím, bình thuờng là sẽ làm nhiều lớp, mỗi lớp một nhiệm vụ, cơ mà vậy lâu wa, hồi đấy em cần nhanh cho kịp deadline
Thế tóm lại thím show ra 1 vài samples code được không? Mình đã post là mới học, mấy cái ưu điểm toàn quote lại từ những post trước, mà hỏi show samples mãi ko thấy ai nói gì. Ví dụ với đoạn: 2 số nguyên 32 bit gộp lại thành 64 bit là kiểu gì, nếu nó ko thuộc 2 memory blocks gần/ không gần nhau thì sao, tự quản lý ghép/nhập bits bằng code manual á?
Cái đoạn "mọi dữ liệu đều là array khổng lồ..." thím có thể show ra luồng code được coi là thế mạnh của ngôn ngữ dùng con trỏ được không, mình sẽ cố thử so sánh tới ngôn ngữ ko dùng (gọi là giấu hoặc là tự động hoặc là an toàn abcxyz gì cũng được)
Lấy ví dụ về bài toán so sánh giá trị 2 điểm ảnh 32 bit (chứa 4 giá trị red green blue alpha) bằng con trỏ
byte[] point1 = new byte[4];
byte[] point2 = new byte[4];
int* p1 = &point1;
int* p2 = &point2;
if(*p1 == *p2)
print("Points are equal")
Như trên ta xem mảng 4 byte là 1 số 32 và chỉ cần 1 phép so sánh, nếu dùng ngôn ngữ như C#, Java thì phải vòng lặp so sánh 4 giá trị, hoặc 4 field của object. Chưa kể safe array trong Java luôn luôn check length trước khi truy cập, làm giảm tốc độ 1 nửa so với con trỏ, nếu trong chương trình hàng tỉ phép tính 1 giây thì hao phí quá lớn.
Last edited:
hydrastucle
quan điểm của mình là chẳng có cái ngôn ngữ nào không dùng con trỏ cả, nó có đưa tận tay đến cú pháp code cho thằng coder dùng hay không thôi
hoặc như JAV thì con trỏ bị ẩn đi ở dưới tầng thư viện, để cho JAV coder tập trung xử lý những vấn đề khác, không phải lằng nhằng về con trỏ nữa bởi nó đã được thư viện tối ưu cú pháp rồi
ví dụ khi truyền dữ liệu nguyên thủy vào method thì auto truyền value hết, khỏi pointer cho lằng nhằng; còn đã truyền obj vào method thì chắc chắn phải truyền pointer
Nipin
ờ bạn nào tò mò xem raw pointer có làm được gì hơn mấy cái reference thì có thể tìm mấy cái thuật toán, ví dụ:
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
Lấy ví dụ về bài toán so sánh giá trị 2 điểm ảnh 32 bit (chứa 4 giá trị red green blue alpha) bằng con trỏ
byte[] point1 = new byte[4];
byte[] point2 = new byte[4];
int* p1 = &point1;
int* p2 = &point2;
if(*p1 == *p2)
print("Points are equal")
Như trên ta xem mảng 4 byte là 1 số 32 và chỉ cần 1 phép so sánh, nếu dùng ngôn ngữ như C#, Java thì phải vòng lặp so sánh 4 giá trị, hoặc 4 field của object. Chưa kể safe array trong Java luôn luôn check length trước khi truy cập, làm giảm tốc độ 1 nửa so với con trỏ, nếu trong chương trình hàng tỉ phép tính 1 giây thì hao phí quá lớn.
Lấy ví dụ về bài toán so sánh giá trị 2 điểm ảnh 32 bit (chứa 4 giá trị red green blue alpha) bằng con trỏ
byte[] point1 = new byte[4];
byte[] point2 = new byte[4];
int* p1 = &point1;
int* p2 = &point2;
if(*p1 == *p2)
print("Points are equal")
Như trên ta xem mảng 4 byte là 1 số 32 và chỉ cần 1 phép so sánh, nếu dùng ngôn ngữ như C#, Java thì phải vòng lặp so sánh 4 giá trị, hoặc 4 field của object. Chưa kể safe array trong Java luôn luôn check length trước khi truy cập, làm giảm tốc độ 1 nửa so với con trỏ, nếu trong chương trình hàng tỉ phép tính 1 giây thì hao phí quá lớn.
// à đoạn này đọc lại đã hiểu, cái này áp dụng cho xử lý ảnh hoặc nói chung là primitive type, ko áp dụng được cho object instance ko.
Còn cái code thuật toán kia đọc trông cũng hay nhưng là dịch bit, ép kiểu cho tràn số để hack tính nhanh cơ mà nhỉ, liên quan gì đến con trỏ? Thím nào thông não hộ với.
// à đoạn này đọc lại đã hiểu, cái này áp dụng cho xử lý ảnh hoặc nói chung là primitive type
Đoạn này vẫn chưa thông não lắm, nếu 2 điểm ảnh đấy cùng giá trị màu nhưng ở 2 block address thì sao? Với lại phép so sánh đấy có áp dụng được cho object instance ko?
Còn cái code thuật toán kia đọc trông cũng hay nhưng là dịch bit, ép kiểu cho tràn số để hack tính nhanh cơ mà nhỉ, liên quan gì đến con trỏ? Thím nào thông não hộ với.
- Ví dụ này p1 và p2 ở 2 địa chỉ khác nhau đó thím. Khi thím dùng *p1 , tức là giá trị của của ô nhớ tại con trỏ p1, bên cạnh đó thì do p1 bao gồm 4 byte, đúng bằng kích thước int luôn, nên khi so sánh sẽ ko phải duyệt từng byte mà mình có thể ném giá trị đó lên thanh ghi luôn. Cụ thể nếu thím disasm ra thì sẽ thấy đoạn so sánh đó thành:
cmp eax, edx
Chứ ko liên quan đến dịch bit, ép kiểu hay tràn số gì.
- So sánh object instance thì ko ổn vì có 1 số thằng sẽ có kích thước nó vượt quá kích thước của kiểu dữ liệu lớn nhất ( 64 bit ) nên trình biên dịch sẽ ko tối ưu nó lên thanh ghi.
// à đoạn này đọc lại đã hiểu, cái này áp dụng cho xử lý ảnh hoặc nói chung là primitive type, ko áp dụng được cho object instance ko.
Còn cái code thuật toán kia đọc trông cũng hay nhưng là dịch bit, ép kiểu cho tràn số để hack tính nhanh cơ mà nhỉ, liên quan gì đến con trỏ? Thím nào thông não hộ với.
raw pointer thì có một vài feature chỉ raw pointer mới có, ví dụ pointer casting như cái thuật toán inverted square root ở trên.
tất nhiên ngôn ngữ bậc cao nếu compiler nó optimize tốt thì từ float sang int nó cũng dùng casting, nhưng cái đó là implementation detail, không guaranteed khác với dùng pointer thì mọi thứ đều explicit.
mà nói đến vụ optimize, đúng là ngoài mấy cái hack như cái ví dụ của bạn trên thì phần lớn mấy thứ liên quan tới pointer thì thằng smart compiler/jit nó sẽ optimize tất (vì bản chất mấy cái reference cũng là pointer thôi), thành ra các bạn thấy nhiều khi nó cũng chả khác bọt gì kể cũng đúng (vì kể cả bound checking nếu thằng compiler nó đủ thông minh nó cũng biết mà bỏ, cái không bỏ dc thì bạn code raw cũng phần lớn phải check bound chả khác vẹo gì).
cho nên dùng raw pointer thì thường có hai use case tôi thấy thực tế hay dùng nhất: một là tương tác với thư viện của c (vì c ngoài pointer ra còn cái vẹo gì nữa đâu), hai là fine grained control, mà cái thứ hai thì trừ khi bạn thực sự biết mình làm gì (ví dụ như ở trên bạn chắc chắn biết được cái int sẽ là 4 byte liền nhau) thì tốt nhất là tránh.
Lấy ví dụ về bài toán so sánh giá trị 2 điểm ảnh 32 bit (chứa 4 giá trị red green blue alpha) bằng con trỏ
byte[] point1 = new byte[4];
byte[] point2 = new byte[4];
int* p1 = &point1;
int* p2 = &point2;
if(*p1 == *p2)
print("Points are equal")
Như trên ta xem mảng 4 byte là 1 số 32 và chỉ cần 1 phép so sánh, nếu dùng ngôn ngữ như C#, Java thì phải vòng lặp so sánh 4 giá trị, hoặc 4 field của object. Chưa kể safe array trong Java luôn luôn check length trước khi truy cập, làm giảm tốc độ 1 nửa so với con trỏ, nếu trong chương trình hàng tỉ phép tính 1 giây thì hao phí quá lớn.
java ko biết chứ C# vẫn có con trỏ và vẫn chơi dc nha.
con trỏ để đọc binary file nhanh hơn nhiều nhé , đại loại là mình tạo 1 object 3d có các đỉnh và điểm rồi, nếu như bt thì đọc từng dòng rồi xem tham số để parse ra , thì đọc kiểu binary là nó lấy hết nội dung file thành cái buffer (BYTE * buffer và size ) rồi map vào cái struct là xong con object 3d, cái này bọn nhật xài nhiều lắm, ngoài ra ai hay xài rapidjson thì sẽ gặp trường hợp là cái rapidjson:
ocument của nó kok copy ra dc hoàn chỉnh, muốn chạy ổn phải lưu lại buffer của file json rồi parse ra, nên phải dính vô con trỏ để chạy nhanh hơn, hay như muốn so sánh 2 cái buffer với nhau thì cũng phải dùng hàm memcmp để so sánh vùng nhớ của 2 con trỏ chỉ vào đó thay vì ngồi for 2 cái mãng byte với nhau , hay như muốn lưu dữ liệu object vào array hay map thì lưu con trỏ của nó là đủ chứ éo ai dở hơi đi lưu nguyên object vì tốn bộ nhớ mà lấy thông tin ra cũng nhanh vì hệ thống kok cần copy ra 1 cái object khác, hay như bạn muốn pass 1 unknown type object sang 1 unknown type object thì dùng con trỏ void * là xong ... nói chung lợi ích con trỏ nhiều vcc ra chứ ít gì
// à đoạn này đọc lại đã hiểu, cái này áp dụng cho xử lý ảnh hoặc nói chung là primitive type, ko áp dụng được cho object instance ko.
Còn cái code thuật toán kia đọc trông cũng hay nhưng là dịch bit, ép kiểu cho tràn số để hack tính nhanh cơ mà nhỉ, liên quan gì đến con trỏ? Thím nào thông não hộ với.
cái thuật toán trên để tính nhanh thôi, kok liên quan con trỏ mấy đâu, thật chất là cần ép về con trỏ hết để lấy tham số ra cho nhanh
ví dụ như
float x, long i
i = (long)x;
với
i = ((long *)&x)[0]
hay
i = *(long*)&x
thì cái nào nhanh hơn ?
Liquid
Lúc đầu học C++ (gần 20 năm trước) nghe khái niệm con trỏ mà do lúc đó ngu với lại tài liệu toàn tiếng anh nên cứ nghĩ con trỏ là con trỏ chuột nên cố gắng mường tượng ra cái màn hình DOS khi complier ra con trỏ nó thế nào, giờ đọc trong này mới hiểu thì đã qua giai đoạn học lập trình rồi.
Lúc đầu học C++ (gần 20 năm trước) nghe khái niệm con trỏ mà do lúc đó ngu với lại tài liệu toàn tiếng anh nên cứ nghĩ con trỏ là con trỏ chuột nên cố gắng mường tượng ra cái màn hình DOS khi complier ra con trỏ nó thế nào, giờ đọc trong này mới hiểu thì đã qua giai đoạn học lập trình rồi.
Thì nó chính là con trỏ chuột mà bạn. Xem ra bạn học 20 năm mà chẳng khá hơn được bao nhiêu.
con trỏ để đọc binary file nhanh hơn nhiều nhé , đại loại là mình tạo 1 object 3d có các đỉnh và điểm rồi, nếu như bt thì đọc từng dòng rồi xem tham số để parse ra , thì đọc kiểu binary là nó lấy hết nội dung file thành cái buffer (BYTE * buffer và size ) rồi map vào cái struct là xong con object 3d, cái này bọn nhật xài nhiều lắm, ngoài ra ai hay xài rapidjson thì sẽ gặp trường hợp là cái rapidjson:
ocument của nó kok copy ra dc hoàn chỉnh, muốn chạy ổn phải lưu lại buffer của file json rồi parse ra, nên phải dính vô con trỏ để chạy nhanh hơn, hay như muốn so sánh 2 cái buffer với nhau thì cũng phải dùng hàm memcmp để so sánh vùng nhớ của 2 con trỏ chỉ vào đó thay vì ngồi for 2 cái mãng byte với nhau , hay như muốn lưu dữ liệu object vào array hay map thì lưu con trỏ của nó là đủ chứ éo ai dở hơi đi lưu nguyên object vì tốn bộ nhớ mà lấy thông tin ra cũng nhanh vì hệ thống kok cần copy ra 1 cái object khác, hay như bạn muốn pass 1 unknown type object sang 1 unknown type object thì dùng con trỏ void * là xong ... nói chung lợi ích con trỏ nhiều vcc ra chứ ít gì
nhưng biến n nó không nhận được giá trị của file truyền vào(file của mình là số 6 thôi) cái nó đọc được length là 1byte. mà kiểu int thì 4 bytes nên nó cho ra giá trị n sai.
sẵn tiện bác rành binary file cho hỏi mình code vầy
nhưng biến n nó không nhận được giá trị của file truyền vào(file của mình là số 6 thôi) cái nó đọc được length là 1byte. mà kiểu int thì 4 bytes nên nó cho ra giá trị n sai.
Nội dung trong file binfile.txt là số "6" hay là fileđược ghi binary vậy bạn
sẵn tiện bác rành binary file cho hỏi mình code vầy
View attachment 73926 nhưng biến n nó không nhận được giá trị của file truyền vào(file của mình là số 6 thôi) cái nó đọc được length là 1byte. mà kiểu int thì 4 bytes nên nó cho ra giá trị n sai.
2021 rồi ae có nên bàn luận cái này nữa ko ạ để e mở mang đầu óc với
đang học về Pointer trong C mà khó quá. Ko biết Pointer trong C++ có khác gì ko ạ?
Pointer trong C++ còn khó hơn C đó bạn. Vì nó còn đẻ ra các thể loại như Pointer of class method, rvalue reference,... Quy tắc ép kiểu pointer của C++ cũng phức tạp hơn chứ không thoải mái như C.
Thế rốt cuộc không ai tổng kết ưu nhược điểm của con trỏ à
Hay là:
Ưu điểm: Có rất ít nhược điểm.
Nhược điểm: Không có ưu điểm.
Nói thật cái này có hỏi thì cũng không biết trả lời như nào luôn. Giống như là hỏi ưu và nhược điểm của cơ học lượng tử là gì. Bạn không thể nói ra được ưu điểm của thứ đương nhiên tồn tại.
Con trỏ là thứ mặc nhiên xuất hiện trong lập trình rồi, nó là hệ quả của kiến trúc máy tính Von Neumann. Chừng nào còn bộ nhớ thì chừng đó còn con trỏ.
Nói thật cái này có hỏi thì cũng không biết trả lời như nào luôn. Giống như là hỏi ưu và nhược điểm của cơ học lượng tử là gì. Bạn không thể nói ra được ưu điểm của thứ đương nhiên tồn tại.
Con trỏ là thứ mặc nhiên xuất hiện trong lập trình rồi, nó là hệ quả của kiến trúc máy tính Von Neumann. Chừng nào còn bộ nhớ thì chừng đó còn con trỏ.
Sent from Xiaomi Redmi 5A using vozFApp
Trong C có lúc khai báo mảng ta phải input độ dài của mảng. Còn lúc truy xuất phần tử mảng ví dụ
array = ["1","2","3","4"];
array[7] = ##
## là giá trị của vùng nhớ nằm đằng sau giá trị của array đó. Thì cái hiệu ứng như vậy gọi là con trỏ hả bác. Cũng ko hiểu lắm cần thông não thêm.
Trong C có lúc khai báo mảng ta phải input độ dài của mảng. Còn lúc truy xuất phần tử mảng ví dụ
array = ["1","2","3","4"];
array[7] = ##
## là giá trị của vùng nhớ nằm đằng sau giá trị của array đó. Thì cái hiệu ứng như vậy gọi là con trỏ hả bác. Cũng ko hiểu lắm cần thông não thêm.
Với C/C++ hiện tại thì ko được phép truy cập ngoài mảng, bị lỗi từ lúc biên dịch ngay.
Giả sử truy cập được thì đúng, nó sẽ trả về 1 giá trị ngẫu nhiên.
Con trỏ là biến chứa địa chỉ của 1 ô nhớ.
Array bản chất là xây dựng con trỏ, toán tử [] là để lấy giá trị của ô nhớ thứ i.
Theo ví dụ trên của bạn thì khi khai báo array, nó sẽ lấy ra 4 ô nhớ, vì array là kiểu int nên mỗi ô sẽ có size là 4 bytes.
array = [1, 2, 3, 4]
Memory 0001 0010 0011 0100
Biến array nó sẽ chứa địa chỉ của ô nhớ đầu tiên là 0001, nếu bạn dùng toán tứ [] để truy cập đến ô bất kỳ, giả sử array[7], thì nó sẽ lấy chuỗi binary hiện tại ở phần nhớ đấy rồi cast về kiểu cho bạn, nên giá trị sẽ ngẫu nhiên.
Đại loại là con trỏ ở những ngôn ngữ bậc thấp, cho phép người dùng ghi/xóa/đọc trực tiếp lên bộ nhớ. Còn ở ngôn ngữ bậc cao bạn không cần đến những thao tác đấy, con trỏ được wrap lại dùng cho tiện và không phát sinh lỗi.
Fire Of Heart
Ai lại đào đi đào lại topic này lên thế.
Vô đây đọc lại mấy page cũ mới thấy buồn cười cái thằng "đéo có mood tốt " nên đi chửi bới người khác là post shit
Bt cũng đéo care đâu, mà nó chửi mình ngứa đít quá nên ngồi cãi lại cho bằng được
))