11 thg 4, 2010

C++. Char array và string

Có sự khác biệt nào giữa chúng không?
Câu trả lời là có, nhưng với những hiểu biết hạn chế của tôi thì nó đại loại là, string được lưu trong vùng nhớ stack, còn mảng ký tự động thì lưu trong vùng nhớ heap, trong C++.( Chú ý ,mảng tĩnh vẫn được lưu trong vùng nhớ stack)


// Có một điều khác biệt là trong C#, hình như string cũng được cấp phát động tức là dước dạng //mảng các ký tự. Cái này nhờ BaoVu comment và chỉ bảo thêm :D

Trong C++, việc sử dụng 2 cái này cũng rắc rối phết, ko thể nhầm lẫn được. Ta đi tìm xem cso cash nào convert giữa chúng.
- Char array to string.
Vd: char *array;
string s = string(array);
Đối với mảng tĩnh.
Vd: char array[25];
string s = string(array,25);
- String to char array
Vd: string s;
char *array;
strcpy(array,s.c_str());

Nhân đây giới thiệu thêm về các loại vùng nhớ:

  • 1. Vùng Const Data : chứa string literal như "hello" và các giá trị data mà giá trị của nó được biết tại compiler-time . Đây là vùng read-only và compiler có thể sử dụng thông tin này để tiến hành "tối ưu" khi tạo ra code ...

  • 2. Vùng Stack : chứa các biến automatic (biến local) hoặc chứa các đối số khi gọi function . Cấp phát trong vùng Stack thì nhanh hơn cấp phát "động" (xem Free Store và Heap ở dưới)

  • 3. Vùng Free Store : dùng để cấp phát memory "động" thông qua new/delete

  • 4. Vùng Heap : dùng để cấp phát memory "động" thông malloc/free

  • 5. Vùng Global/Staic : dùng để chứa các biến static, global .... "được tính toán và cấp phát 1 lần, ngay khi khởi động chương trình, và giữ nguyên trong suốt thời gian chương trình chạy, như vậy có nhược điểm là nếu kích thước lớn quá sẽ chiếm dụng nhiều bộ nhớ hệ thống => bạn không chủ động bỏ bớt đi được nếu không cần nó nữa, nó chỉ bị xóa bỏ khi chương trình kết thúc, vì thế chương trình của bạn nên có bộ nhớ tĩnh càng nhỏ càng tốt, chỉ khai báo trong bộ nhớ tĩnh những cái cần thiết." ( như et đã đề cập trong bài viết ở phía dưới)


Ghi chú : đối với nhiều người "vùng memory dùng để cấp phát động" đều được gọi là heap, nghĩa là vùng "Free Store" + "Heap" đều được gọi chung là heap . Điều đó cũng chấp nhận được. Còn ở đây chúng ta tách biệt "Free Store" và Heap để chỉ rõ một vùng dùng new/delete còn vùng kia dủng malloc/free .

Với 2 vùng "Free Store" + "Heap", "bạn cấp phát nó khi chương trình đang chạy, có thể loại bỏ nó khi cần, cho phép bạn chủ động quản lý bộ nhớ, nhưng có nhược điểm là nếu bạn "quên" không loại bỏ nó sẽ có nguy cơ rò rỉ bộ nhớ và thậm chí ảnh hưởng đến toàn bộ hệ thống." (et)

Vấn đề này liên quan đến việc quản lý bộ nhớ của OS (ta chạy trên nền OS mà), không phải là ta không coi mọi vùng bộ nhớ như nhau được nhưng về nguyên tắc thì không nên (do OS quy định, xem trong nguyên lý OS). DOS quản lý bộ nhớ dưới dạng các trang (page), mỗi trang 64k. Do đó ta thấy có các loại file thi hành khác nhau (COM, EXE), file COM : code và data cùng nằm trong 1 đoạn (64k), file EXE : code nằm trong 1 đoạn (64k) riêng, data nằm trong 1 đoạn riêng (đây chính là mấu chốt) Vì data nằm trong 1 đoạn nên khi lập trình ta được phép khai báo dữ liệu tĩnh tối đa là 64k (bạn khái báo 1 mảng vượt 64k xem, bị bào lỗi data too big ngay). Do đó nếu muốn dùng nhiều hơn 64k data thì ta phải "lấn chiếm" sang vùng khác (heap) và bạn phải dùng cấp phát động (hay pointer).

Copy nhanh còn đi xem bóng đá, Real Madrid vs Barcelona. Kinh điển chưa :D

2 nhận xét:

Unknown nói...

cho minh hoi chuyen tu string sang array tinh thi chuyen nhu the nao???thanks

Unknown nói...

co o kia kia!!