tìm câu trả lời thỏa đáng cho sự khác biệt giữa Malloc và New

xin cho hoi tiep
Trang co noi la malloc co lam viec voi memory nen hardware dependence, vay thi new cung lam viec voi memory co ma? Lieu new co goi den malloc trong code cua no khong hay lam sao no co the allocate truc tiep duoc bo nho?

Trang co the noi ro y abstract... cua new duoc khong?

Xuan Son

PS: tra loi bang tieng ANh thi cang tot :)
 
Chỉnh sửa lần cuối:
Nguyễn Xuân Sơn đã viết:
xin cho hoi tiep
Trang co noi la malloc co lam viec voi memory nen hardware dependence, vay thi new cung lam viec voi memory co ma? Lieu new co goi den malloc trong code cua no khong hay lam sao no co the allocate truc tiep duoc bo nho?

Xuan Son
Làm thế nèo để allocate bộ nhớ là tùy thuộc vào compiler, dễ nhất là vào http://gcc.gnu.org download source code của GCC về xem thử là bít ngay muh.
 
Đặng Trần Hiếu đã viết:
Đó, chính vì cái chuẩn mà anh đang nói đến đó, ko thể chỉ vì ý kiến riêng của 1 người dù người đó có là tác giả của C đi nữa mà có thể thay đổi cái quy tắc đã được sử dụng ngay từ những ngày đầu của C là "Ko được đặt tên biến trùng với tên kiểu" được ---> ko thể có ngoại lệ, nếu ko sẽ phá chuẩn ---> bắt buộc new phải là language-level construct.

Khổ thiệt, làm mấy bài dài dằng dặc mà ông em vẫn không chịu hiểu cho ;). Giả sử thế này, cái hồi thiết kế C++, ông Stroustrup biết rằng 20 năm sau anh em mình sẽ cãi nhau về ba cái vớ vẩn này, nên quyết định để syntax cho new là <classid>.new thay vì new classid, vậy thì những cái kiểu là đối số gì gì đó có còn ý nghĩa gì không. Cũng phải nói thêm là thay đổi này không quá khó khăn và chẳng ảnh hưởng chút nào đến output. Anh thấy em cũng dùng gcc (g++), có thể xem mấy file parser.y hay lex gì đó để xem code được parse thế nào khi biên dịch (xong rồi tiện tay làm quả "việt" hoá C++ cho vui :D )

Anh thấy trả lời của Trang ngắn gọn và chính xác nhất đấy. :)>-
 
Vũ Thanh Điềm đã viết:
Giả sử thế này, cái hồi thiết kế C++, ông Stroustrup biết rằng 20 năm sau anh em mình sẽ cãi nhau về ba cái vớ vẩn này, nên quyết định để syntax cho new là <classid>.new thay vì new classid, vậy thì những cái kiểu là đối số gì gì đó có còn ý nghĩa gì không.
Ý em là nói như anh thì nếu muốn thì hoàn toàn có thể biến new thành 1 function nhận 1 kiểu mà ko có ảnh hưởng rì. Thế thì chẳng có lý do rì để làm new là operator ---> quay lại câu hỏi đầu tiên của anh Sơn ---> đó ko phải là lý do new phải là language-level construct.

Còn nói như anh, kể cả ông ý có muốn biến new thành new <classid> đi nữa thì cũng chẳng thay đổi được rì cả vì 2 lý do. 1 là làm thế nèo để lấy được classid của kiểu??? Lại phải có 1 operator khác để lấy classid của kiểu rùi ---> lúc đó lại cãi nhau về cái operator nì ---> ko những ko giải quyết được vấn đề mà chỉ làm cho ngôn ngữ rắc rối thêm. 2 là, anh đang nói đến việc new <classid>, vấn đề lại là ở chỗ khi dùng int trong 1 hàm thì int ko tự động chuyển thành classid của kiểu ----> new <classid> của anh dù có đi nữa cũng khác hẳn với new int.

Tóm lại, từ nãy đến giờ, anh & em đang tranh luận về việc new có thể là function hay ko. Em vẫn khẳng định là ko thể. Lý do: anh thử tìm bất cứ 1 hàm nèo có thể sử dụng 1 kiểu làm đối số xem, chắc chắn là trong số các hàm được cung cấp bởi C & C++ cùng với các API của từng OS, ko có 1 hàm nèo như vậy.
 
Đặng Trần Hiếu đã viết:
Ý em là nói như anh thì nếu muốn thì hoàn toàn có thể biến new thành 1 function nhận 1 kiểu mà ko có ảnh hưởng rì. Thế thì chẳng có lý do rì để làm new là operator ---> quay lại câu hỏi đầu tiên của anh Sơn ---> đó ko phải là lý do new phải là language-level construct.
Thì đúng thế. Anh đã nói là op hay function có khác nhau gì mấy đâu, và anh cũng nói nó không phải là key trong vấn đề này. Nếu em vẫn còn băn khoăn về mấy cái op này thì để anh cũng bỏ luôn một nhận xét trước của anh về quan hệ giữa op và languagle level construct, mấy cái như +,-,*,/ etc gọi nó là built-in functions/ops thì đúng hơn.
Còn nói như anh, kể cả ông ý có muốn biến new thành new <classid> đi nữa thì cũng chẳng thay đổi được rì cả vì 2 lý do. 1 là làm thế nèo để lấy được classid của kiểu??? Lại phải có 1 operator khác để lấy classid của kiểu rùi ---> lúc đó lại cãi nhau về cái operator nì ---> ko những ko giải quyết được vấn đề mà chỉ làm cho ngôn ngữ rắc rối thêm. 2 là, anh đang nói đến việc new <classid>, vấn đề lại là ở chỗ khi dùng int trong 1 hàm thì int ko tự động chuyển thành classid của kiểu ----> new <classid> của anh dù có đi nữa cũng khác hẳn với new int.

Anh viết <classid> là khái quát về syntax thôi. Trong program thì thay class thật vào chứ (ví dụ thay vì viêt new int thì thành int.new(), new Fred thì thành Fred.new(), etc). Khi đó em xem về mặt syntax, nó có khác gì function thường không. Và chính trong câu của em vừa rồi, có một ý quan trọng anh muốn nói: cần phải có một "cái gì" để xác định kiểu, mà bởi vì kiểu thì (phần lớn) tạo ra khi program, cho nên "cái gì đó" (=new) phải nằm trên language-level. Đợi Trang giải thích về abstract data (từ này hay, đáng khoanh :D) sẽ rõ hơn.


Tóm lại, từ nãy đến giờ, anh & em đang tranh luận về việc new có thể là function hay ko. Em vẫn khẳng định là ko thể. Lý do: anh thử tìm bất cứ 1 hàm nèo có thể sử dụng 1 kiểu làm đối số xem, chắc chắn là trong số các hàm được cung cấp bởi C & C++ cùng với các API của từng OS, ko có 1 hàm nèo như vậy.

Thì thế anh mới bảo là xa rời câu hỏi rồi mà. Còn việc mọi thứ trong C++ nó như thế thì anh chỉ biết cám ơn chúa vì nó đã thế :), chứ không khẳng định là nó phải thế.
 
Nguyễn Xuân Sơn đã viết:
xin cho hoi tiep
Trang co noi la malloc co lam viec voi memory nen hardware dependence, vay thi new cung lam viec voi memory co ma? Lieu new co goi den malloc trong code cua no khong hay lam sao no co the allocate truc tiep duoc bo nho?

Trang co the noi ro y abstract... cua new duoc khong?

Xuan Son

PS: tra loi bang tieng ANh thi cang tot :)

New is a C++ operator (and some other younger languages) that could be performed on abstract data (native type, user-defined type, class, etc.). Since it is a programming syntax, it becomes de-facto when more and more people adopt the language. Just like a+b, the plus sign gives a sum of a and b, in which you could override to do whatever operation you could imagine. Along the same line, new give you an instance of something (or destroy it if you're really against mankind;) ). In order to hold that something, allocating memory is necessary. However, it is not required that new would need to call malloc. If the data type is some native types such as integer, new could use low-level instruction to allocate a byte (or more) of memory to keep the data. new makes the best effort to find the constructor of a type and execute it. What is in the constructor is totally up to the author of the type. New has some "smartness" (abstracting implementation from data) in it, so that it makes getting an instance of a data type is easy.

Malloc, on the other hand, is a little bit more "dumb" in the sense that it just allocates the memory. It, under no circumstances, could know about the data that you want it to create. Hence, it does not really belong to the programming language, which I think is a predefined set of rules to manipulate a well defined dataset.

Cheer,
ĐTrang
 
Chỉnh sửa lần cuối:
Anh viết <classid> là khái quát về syntax thôi. Trong program thì thay class thật vào chứ (ví dụ thay vì viêt new int thì thành int.new(), new Fred thì thành Fred.new(), etc). Khi đó em xem về mặt syntax, nó có khác gì function thường không. Và chính trong câu của em vừa rồi, có một ý quan trọng anh muốn nói: cần phải có một "cái gì" để xác định kiểu, mà bởi vì kiểu thì (phần lớn) tạo ra khi program, cho nên "cái gì đó" (=new) phải nằm trên language-level. Đợi Trang giải thích về abstract data (từ này hay, đáng khoanh ) sẽ rõ hơn.
Đó, cái này đúng 100% những rì em đang cố giải thích. New ko thể là library function vì nếu nó là library function thì ngay cả nếu cú pháp có như anh nói thì anh cũng ko thể dùng Fred.new() vì new ko được định nghĩa trước trong class Fred của anh ---> nó phải là language-level construct nếu ko nó sẽ ko thể tự động có cho mỗi class được.
 
Back
Bên trên