<![CDATA[Latest posts for the topic " Thảo luận về địa chỉ vùng nhớ Stack"]]> /hvaonline/posts/list/23.html JForum - http://www.jforum.net Thảo luận về địa chỉ vùng nhớ Stack Code:
#include"iostream"
using namespace std;
void display(){
  int y=-2;
  cout<<&y<<endl;
}
int main(){
  int x=-1;
  cout<<&x<<" ";
  display();
  return 0;
}
Code 2: Code:
#include"iostream"
using namespace std;
void display(){
  int y=-2;
  cout<<&y<<endl;
}
void hien(){
  display();
}
int main(){
  int x=-1;
  cout<<&x<<" ";
  hien();
  return 0;
}
Mình complier của 2 đoạn mã và chạy đi chạy lại chúng nhiều lần thì thấy khoảng cách địa chỉ của x và y trong 2 đoạn mã là không giống nhau . VD như trên máy mình thì trong Code 1 là 44 còn Code 2 là 60. Thứ 1: Tại sao khoảng cách địa chỉ của x, y lớn đến vậy, -> có 1 vùng nhớ nằm giữa 2 biến x, y. Thứ 2: Tại sao tại sao khoảng cách địa chỉ của 2 đoạn mã là khác nhau. Còn đây là lập luận của mình về 2 vấn đề trên mọi người xem có đúng không: Như ta đã biết 1 chương trình gồm nhiều hàm được tạo lên, mỗi 1 hàm tương ứng với 1 stack frame. Mỗi khi 1 hàm được gọi thì 1 stack frame được tạo ra, và khi hàm đó trở về (function return ) thì stack frame của hàm đó bị giải phóng. Mỗi 1 stack frame chứa 3 thông tin: 1. Tham số truyền vào 2. Biến local của hàm 3. dòng lệnh trong doạn mã mà hàm trở về (number line function return ) hay trong nhiều sách còn viết là địa chỉ mà hàm đó thực hiện (the address at which the function is executing) vấn đề 1: Chính vì stack frame chứa 3 thông tin trên nên trong 2 đoạn mã địa chỉ của x và y cách xa nhau đến vậy. vấn đề 2: Do trong code 2 có 3 stack chứ không phải 2 stack như trong code 1 nên khoảng cách địa chỉ giữa 2 đoạn mã là khác nhau. Không biết thế đã đúng chưa . Mong mọi người vào ủng hộ ]]>
/hvaonline/posts/list/18152.html#108880 /hvaonline/posts/list/18152.html#108880 GMT
Re: Thảo luận về địa chỉ vùng nhớ Stack /hvaonline/posts/list/18152.html#108971 /hvaonline/posts/list/18152.html#108971 GMT Re: Thảo luận về địa chỉ vùng nhớ Stack /hvaonline/posts/list/18152.html#109025 /hvaonline/posts/list/18152.html#109025 GMT Re: Thảo luận về địa chỉ vùng nhớ Stack /hvaonline/posts/list/18152.html#109045 /hvaonline/posts/list/18152.html#109045 GMT Re: Thảo luận về địa chỉ vùng nhớ Stack /hvaonline/posts/list/18152.html#109083 /hvaonline/posts/list/18152.html#109083 GMT Re: Thảo luận về địa chỉ vùng nhớ Stack /hvaonline/posts/list/18152.html#109154 /hvaonline/posts/list/18152.html#109154 GMT Re: Thảo luận về địa chỉ vùng nhớ Stack http://blogs.msdn.com/oldnewthing/archive/2004/01/08/48616.aspx. hoặc ở http://www.angelcode.com/dev/callconv/callconv.html - Địa chỉ trả về của hàm: là địa chỉ của lệnh ngay sau lệnh call của assembly - Biến cục bộ được sử dụng bên trong hàm: chú ý, biến này không bao gồm biến static. Ngoài 3 thông tin chính trên, stack còn chứa nhiều thông tin khác: - Cấu trúc SEH (Structure Exception Handling): thông tin này dùng để bắt các SEH event chain(chú ý là SEH của Windows khác với SEH của C++). - Canary: Đây là một giá trị chèn vào stack nhằm chống khai thác stack overflow. Vấn đề về stack overflow protection sẽ bàn ở chủ đề khác. (Có thể còn một số thông tin khác, nhờ mọi người bổ sung) :) Cùng một đoạn code, khi biên dịch ở các compiler khác nhau, khi thực thi sẽ in ra địa chỉ stack khác nhau, bởi mỗi compiler có một kiểu code prolog, code epilog quản lý stack khác nhau. :). Trong Windows, mỗi thread có một stack khác nhau. Mọi hàm trong thread đều sử dụng chung stack này. Kích thước mặc định của stack này là 1MB và có thể thay đổi được khi biên dịch với tùy chọn hợp lý. Vị trí bộ nhớ chứa stack của thread và vị trí bộ nhớ chứa code thực thi của hàm hoàn toàn ở hai vùng cách biệt nhau.]]> /hvaonline/posts/list/18152.html#110461 /hvaonline/posts/list/18152.html#110461 GMT Thảo luận về địa chỉ vùng nhớ Stack Code:
class Student
{
int StudentID = 0;
}
void main(){
Student *a = new Student();
}
Với lại việc đặt tên Class và Attribute với nhiều kí tự hoặc ít kí tự (như Student thay = a) như vậy khi biên dịch có ảnh hưởng gì tới ô nhớ hay chỉ tăng dung lượng file Code thôi ? Mong các anh giúp đỡ :) ]]>
/hvaonline/posts/list/18152.html#270576 /hvaonline/posts/list/18152.html#270576 GMT
Thảo luận về địa chỉ vùng nhớ Stack /hvaonline/posts/list/18152.html#270577 /hvaonline/posts/list/18152.html#270577 GMT Thảo luận về địa chỉ vùng nhớ Stack

ndp1007 wrote:
Máy anh cho em hỏi xí Đi test công ty em fail câu này, từ nào giờ không để ý máy vụ này Sau đây là 1 Class, với Class đó, cách khai báo hàm main như thế chiếm bao nhiêu byte dữ liệu và số byte đó khác với số byte của cái file .exe khi biên dịch ? Code:
class Student
{
int StudentID = 0;
}
void main(){
Student *a = new Student();
}
Với lại việc đặt tên Class và Attribute với nhiều kí tự hoặc ít kí tự (như Student thay = a) như vậy khi biên dịch có ảnh hưởng gì tới ô nhớ hay chỉ tăng dung lượng file Code thôi ? Mong các anh giúp đỡ :)  
Sao bạn không tự thử nghiệm luôn đi nhỉ? Có thể dùng sizeof để kiểm tra kích thước của class đó.]]>
/hvaonline/posts/list/18152.html#270579 /hvaonline/posts/list/18152.html#270579 GMT
Thảo luận về địa chỉ vùng nhớ Stack

Stanley_00 wrote:
Sao bạn không tự thử nghiệm luôn đi nhỉ? Có thể dùng sizeof để kiểm tra kích thước của class đó. 
Dùng tool VS 2010 bỏ qua complier header nội dung như sau : Code:
#include <stdio.h>
#include <conio.h>
class Student
{
	private :
		int StudentID;
		char* StudentName;
	public :
		Student()
		{
			this->StudentID=0;
			this->StudentName="ndp1007";
		}
};

int main()
{
	Student *a = new Student();
	printf("%d",sizeof(a));
	getch();
	return 0;
}
Trên winxp 32bit : Màn hình để số 4 ( dù // đi 2 attribute StudentID và Name, thay int = float, char ... cũng là số 4) (1) Size của file exe là 32 Kb ( k0 biết máy compiler của máy Editor khác ntn ) (1) : Cái này em cũng ko rõ, huynh nào giải thích dùm em với :D Em hiểu là size của 1 lớp là = sum(Attributes of Class) Khi khai báo Student *a = new Student(); thì con trỏ a trỏ tới địa chỉ được cấp phát với size = size của class Student ? Mà giữa 2 cách khai báo Student *a vs Student *a = new Student() size chiếm trong bô nhớ có khác nhau không ? ( Theo như em test code trên thì như nhau)]]>
/hvaonline/posts/list/18152.html#270643 /hvaonline/posts/list/18152.html#270643 GMT
Thảo luận về địa chỉ vùng nhớ Stack /hvaonline/posts/list/18152.html#270648 /hvaonline/posts/list/18152.html#270648 GMT