Memory layout in C: Một chương trình C được tổ chức trong memory như thế nào? Heap và Stack là gì?

  Рет қаралды 24,447

Code Kỹ

Code Kỹ

Күн бұрын

Пікірлер: 63
@codeky2261
@codeky2261 4 жыл бұрын
Một lưu ý là ở video chỉ liệt kê các các phần cơ bản của một stack frame để các bạn dễ nắm bắt thôi nhé. Một stack frame đầy đủ còn có exception handler, saved registers... Và một câu hỏi phụ dành cho các Code Kỹ: truy cập biến trong stack và trong heap cái nào sẽ nhanh hơn?
@minhquannguyen3605
@minhquannguyen3605 4 жыл бұрын
Theo mình hiểu là stack sẽ nhanh hơn. Con trỏ chương trình thường sẽ trỏ lên stack (trong việc xử lý các vấn đề scope). Trên heap thì sẽ phải tốn qua 1 bước qua pointer, ngoài ra code trên heap cũng ko đc đưa vào cache, register trong quá trình optimize, trong khi stack thì có thể
@namdophuong2609
@namdophuong2609 10 ай бұрын
Anh ơi, cho em hỏi là trong ngôn ngữ lập trình C thì thực sự sẽ có mấy kiểu cấp phát bộ nhớ ạ ? Em có tham khảo trên một số trang web thì nói có hai cách cấp phát đó là static memory allocation và dynamic memory allocation. Nhưng có một số nơi còn có thêm cả automatic memory allocation nữa ạ. Mong anh giải đáp thắc mắc giúp em ạ. E cảm ơn !
@longvungoc260
@longvungoc260 6 ай бұрын
hay quá ạ, anh có thể ra thêm video về compiler và cách compiler hoạt động không ạ
@MrThinhle
@MrThinhle 3 жыл бұрын
Cảm ơn anh nhé, rất dễ hiểu ạ
@KienNguyenTT
@KienNguyenTT 6 ай бұрын
anh hướng dẫn lập trình assembly đi ạ
@lennguyenphuoc8164
@lennguyenphuoc8164 Жыл бұрын
Học môn nào thì có thể biết được các kiến thức về phần này vậy ad
@LongHoang-xl7vj
@LongHoang-xl7vj Жыл бұрын
Hợp ngữ - Assembly nha bạn
@minhcuongtran8504
@minhcuongtran8504 4 жыл бұрын
ôi đỉnh , a ra video thêm về mcu đi a , những cái cần để đi thực tập ạ
@codeky2261
@codeky2261 4 жыл бұрын
Ok nhé ;)
@parkle_
@parkle_ 2 жыл бұрын
cảm ơn anh rất nhiều
@haoanh655
@haoanh655 2 жыл бұрын
cho e hỏi toàn bộ memory layout nằm trên RAM phải k ạ?
@ducduong6328
@ducduong6328 Жыл бұрын
chuan, memory dich ra la ram ma
@baotang6436
@baotang6436 10 ай бұрын
@@ducduong6328vậy rom chứa gì bạn
@NgPhucAn
@NgPhucAn 6 ай бұрын
@@ducduong6328không có kiến thức thì đừng có dạy người ta. RAM là random access memory, còn memory là bộ nhớ.
@ducduong6328
@ducduong6328 6 ай бұрын
@@NgPhucAn ram la thang cha may ay
@NgPhucAn
@NgPhucAn 6 ай бұрын
@@ducduong6328 kkk cmt 1 năm rồi mà vẫn cay à =))
@mykun8737
@mykun8737 2 жыл бұрын
đoạn push() hàm foo vào stack bạn vẽ nhầm, vì khi đó hàm foo phải ở bên trên stack mới đúng
@chungtrinhuc4936
@chungtrinhuc4936 2 жыл бұрын
Bạn nhầm rồi, cái stack đầu nó ở dưới đáy nó ở trên theo như hình minh họa nên như thế là đúng r
@ph2in1
@ph2in1 Жыл бұрын
bạn làm về memory pool region nhé.
@viennguyenquoc7920
@viennguyenquoc7920 3 жыл бұрын
ad có thể giải thích rõ hơn về Stack Frame dc không ạ
@PiPuisme
@PiPuisme Жыл бұрын
Dạ cho em hỏi khi mình tạo một con trỏ thì con trỏ đó sẽ được lưu ở stack còn data tại địa chỉ con trỏ trỏ đến được cấp phát sẽ được lưu trong heap, như vậy có đúng không ạ? Em cám ơn.
@codeky2261
@codeky2261 Жыл бұрын
Data chỉ được lưu trong heap nếu đc cấp phát động, như là bằng malloc hoăc new. Khi cấp phát động thì sẽ trả về con trỏ để quản lý vùng nhớ đó.
@mandaraanda2597
@mandaraanda2597 4 жыл бұрын
Cho em hỏi là em sv năm 4 rồi muốn hướng sang Embedded (cụ thể là lập trình ECU xe máy) thì lập trình hướng đối tượng có nên học ko ạ hay mình chỉ cần tập trung vào vi điều khiển ạ?
@codeky2261
@codeky2261 4 жыл бұрын
Hi em, Lập trình embedded cho ECU chủ yếu vẫn dùng C và thường thì không lập trình theo OOP. Theo định hướng nhúng cho ECU thì trước tiên em nên tập trung vào C, kiến trúc vi điều khiển, các ngoại vi và các chuẩn giao tiếp bus (trong automotive thì LIN, CAN, Flexray...). Sau khi đã vững với C và embedded, em có thể học thêm OOP để mở rộng lĩnh vực của mình. Em cũng có thể áp dụng một số khái niệm của object (không phải full OOP) vào lập trình C cho embedded để có kiến trúc chương trình tốt hơn. Chúc em thành công với định hướng của bản thân nhé :)
@mandaraanda2597
@mandaraanda2597 4 жыл бұрын
@@codeky2261 dạ, em chân thành cảm ơn góp ý của anh. Và nếu giờ em muốn học thêm về automotive thì em nên học ở đâu ạ (em ở sài gòn). Mong chờ nhiều nhiều video của anh để em có thể học hỏi và sẻ chia cho nhiều bạn khác hơn ạ. Chúc anh 1 ngày 20.11 thật nhiều niềm an vui.
@codeky2261
@codeky2261 4 жыл бұрын
Cảm ơn em. Anh cũng không biết trung tâm nào dạy về automotive tốt ở Saigon. Sắp tới nhóm sẽ thêm các video về automotive. Em tiếp tục ủng hộ nhóm nhé. :)
@mandaraanda2597
@mandaraanda2597 4 жыл бұрын
@@codeky2261 Dạ, em để sub alarm lun òi :v có video là em ủng hộ liền liền luonn
@phuco8206
@phuco8206 3 жыл бұрын
Hi bạn, nếu bạn muốn theo hướng automative thì có thể apply vào FPT nhé, bên đấy có tuyển fresher nha. Chỉ cần bạn có kiến thức về C và vi điều khiển là được.
@quanphamanh957
@quanphamanh957 3 жыл бұрын
Anh ơi cho em hỏi là sao ví dụ về stack thì function foo lại ném ở dưới function main mà không phải bỏ từ trên xuống ạ
@atNguyen-gm6cf
@atNguyen-gm6cf 3 жыл бұрын
cùng câu hỏi
@Huynh-Tan-Quoc
@Huynh-Tan-Quoc 3 жыл бұрын
Mình code thì có thể code được, vì cũng làm một vài project rồi. Mà hiện mình chưa tự tin ứng cử vào vị trí lập trình nhúng. Vậy có lời khuyên nào cho mình? Do mình thích code nhúng.
@codeky2261
@codeky2261 3 жыл бұрын
Mình có thể tự làm một số project về nhúng, vừa để nâng skill, vừa để có cái show kinh nghiệm. Code thì up lên github, demo quay video lại và up lên youtube. CV thì liệt kê các project đó và dẫn link đến code+demo. Ý tưởng về project thì có thể tìm trên mạng. :)
@Huynh-Tan-Quoc
@Huynh-Tan-Quoc 3 жыл бұрын
@@codeky2261 Mình đã từng làm một số project, nhưng vẫn chauw tự tin PV, do mình cũng đã hơn 32 rồi. Mình chưa hiểu lắm các thuật ngữ trong code, với cũng ít dùng, mặc dù có làm một vài cái như smart Locker, Thiết bị thước đo lường...
@hoantran3541
@hoantran3541 3 жыл бұрын
@@Huynh-Tan-Quoc Tầm tuổi đấy mà chưa tự tin với kiến thức thì... Trẻ họ còn chỉ bảo, chứ lớn phải nỗ lực để mức kinh nghiệm nó tương đương với tuổi. Sự thực nó vậy. Không biết hỏi vậy để làm gì
@Huynh-Tan-Quoc
@Huynh-Tan-Quoc 3 жыл бұрын
@@hoantran3541 Thật ra khi đi làm, mình điều biết giữa làm được, làm chạy ổn định, làm tối ưu là các cấp bậc level nó khác nhau. Mình code này cũng được 2 năm, nhưng với các project nó bé tí, tính cọ xác ko cao. Với chưa vòa môi trường chuyên nghiệp, trước giờ mình toàn tự mò tới mò, chưa qua trường lớp nào về lập trình cả. Kiểu dân trong đạo hay nói mình là dân ngoại đạo vậy ý. Nhiều lúc code được, nhưng ko hiểu nó thuật ngữ chuyên môn gì. Với mình code trên nền có sẵn thư viện rồi, mình kế thừa thư viện ý vào ứng dụng của mình. cho nên nhiều lúc ứng dụng mình ko quá phức tạp, nên kiến thức nó cũng hạn hẸp. mình chuyên về QL hệ thống, nhưng giờ muốn đổi qua chuyên môn này ý.
@minhcuongtran8504
@minhcuongtran8504 3 жыл бұрын
cho em hỏi bộ nhớ flash có thể ở trong vùng text đúng k ạ . và stack có được tạo ra bởi vùng nhớ flash k ạ
@codeky2261
@codeky2261 3 жыл бұрын
Vùng text chứa code nên trong bare application thường là dùng flash luôn. Với OS-based application thì os sẽ load chương trình vào ram cho nên text segment sẽ nằm ở RAM. Về stack, và cả heap, thì mình sẽ dùng RAM vì đặc thù các vùng này liên tục cấp phát và giải phóng bộ nhớ, nghĩa là đọc ghi liên tục. Nếu dùng flash thì sẽ rất chậm, chưa kể flash ngày xưa có write cycle khá ít :)
@minhcuongtran8504
@minhcuongtran8504 3 жыл бұрын
Vâng em cảm ơn . A ra thêm video đi ạ
@abisut
@abisut 4 жыл бұрын
Mình không biết có đúng hay là không, nhưng có vẻ đây là memory layout của 1 process(trên linux chẳn hạn) mà C program là một trong những process như vậy nên nó có memory layout như bạn trình bày. Bạn có thử làm với C trên window chưa? cái memory layout có giống vậy không? Mình nghĩ đây thật sự có liên quan mật thiết đến platform chứ không chính xác là với mọi C program trên mọi platform là nó như vậy. Trên window nó khác, trên linux nó khác, và có vẻ trên Mac cũng khác luôn.
@codeky2261
@codeky2261 4 жыл бұрын
Thanks, câu hỏi của bạn rất hay và gợi mở được nhiều vấn đề mới không có trong video. Memory layout của một process trên linux cũng tương tự như vậy, nhưng không phải vì vậy mà một chương trình C có cấu trúc như đó. Thực ra là Linux kernel được viết bằng C. Các segment như Text, DS và BSS là các concept trong computer science chứ không phải thuộc về Linux. Từ kiến trúc của chip 8086 đã support các Code segment, Data segment, Stack segment… Các ngôn ngữ hiện đại hơn sau này apply và phát triển các concept này. Khi compiler compile code C ra một chương trình thực thi thì đã bao gồm Text, DS và BSS rồi. Nếu chương trình được build và chạy trên môi trường OS như Linux hoặc Window thì OS sẽ tạo virtual address space cho process và load chương trình vào mem. Heap và Stack được allocate bởi OS. Chú ý là trong hình visualize các segment này liền kề nhau nhưng thực tế không cần như vậy. Allocate như thế nào là do OS quyết định. Nếu build chương trình bare-metal (non-os) cho các ứng dụng embedded, chúng ta cần define các segment này trong linker script và viết thêm startup code (thường là dùng assembly) Thân :)
@toancong2327
@toancong2327 4 жыл бұрын
@@codeky2261 cảm ơn bạn đã cho mình biết thêm kiến thức hữu ích này. ESP, EFP thực sự rất hữu ích trong quá trình trace back. Anyway, kênh này cũng là 1 trang khá hay để hiểu hơn về virtual memory: cpp.daynhauhoc.com/8/10-phan-loai-cac-vung-nho-stack-va-heap/ Thank !!!
@codeky2261
@codeky2261 4 жыл бұрын
Thanks bạn. Link bạn gửi rất hữu ích.
@_USER_NAME_
@_USER_NAME_ 4 жыл бұрын
hay quá A
@codeky2261
@codeky2261 4 жыл бұрын
Thanks bạn đã ủng hộ kênh nhé
@ngoctranss
@ngoctranss Жыл бұрын
Anh ơi cho em xin slide được không ạ
@duongvumanh5651
@duongvumanh5651 Жыл бұрын
cho em hỏi tại sao stack lại cấp từ địa chỉ cao đến thấp với ạ
@codeky2261
@codeky2261 Жыл бұрын
Cái này do OS hoặc compiler quy định. Tùy theo OS hoặc compiler mà sắp xếp stack từ đc cao xuống thấp hoặc thấp lên cao thôi.
@hoc-lap-trinh
@hoc-lap-trinh 4 ай бұрын
⁠@@codeky2261do kiến trúc máy tính quy định đó bạn, OS hay compiler chỉ giúp phân bố phần bộ nhớ làm stack thôi, các lệnh push luôn làm giảm giá trị của stack pointer (SP), pop thì ngược lại
@nghialuu2203
@nghialuu2203 3 жыл бұрын
Những cái này thì đọc sách nào nhỉ ?
@levantho7264
@levantho7264 4 жыл бұрын
Thanks anh.
@codeky2261
@codeky2261 4 жыл бұрын
Thanks em đã ủng hộ kênh nhé
@levantho7264
@levantho7264 4 жыл бұрын
@@codeky2261 mong anh ra nhiều video ....anh có chuyên về MCU không ạ? em muốn học hỏi thêm....
@codeky2261
@codeky2261 4 жыл бұрын
Sắp tới sẽ làm video về embedded nhé :)
@hoangbachdang9075
@hoangbachdang9075 2 жыл бұрын
local variable em không thấy anh đề cập
@ducduong6328
@ducduong6328 Жыл бұрын
Stack segment Call Stack (thường được gọi là Stack) được dùng để cấp phát bộ nhớ cho tham số của các hàm (function parameters) và biến cục bộ (local variables). Call Stack được thực hiện theo cấu trúc dữ liệu stack, do đó, trước khi nói về phân vùng Stack trên bộ nhớ ảo mình sẽ trình bày cho các bạn về cấu trúc dữ liệu stack trước.
@hoc-lap-trinh
@hoc-lap-trinh 4 ай бұрын
Local variable được chứa trong stack đó bạn
Pointers and dynamic memory - stack vs heap
17:26
mycodeschool
Рет қаралды 1,5 МЛН
路飞做的坏事被拆穿了 #路飞#海贼王
00:41
路飞与唐舞桐
Рет қаралды 25 МЛН
If people acted like cats 🙀😹 LeoNata family #shorts
00:22
LeoNata Family
Рет қаралды 41 МЛН
you will never ask about pointers again after watching this video
8:03
Lập trình C++: #10 Stack và Heap
15:19
CodeGame
Рет қаралды 1,3 М.
Stack vs Heap Memory - Simple Explanation
5:28
Alex Hyett
Рет қаралды 259 М.
«Если 50 детей не рожу - ничего не добился»
1:26:17
A New Era for C and C++? Goodbye, Rust?
9:08
Travis Media
Рет қаралды 110 М.
路飞做的坏事被拆穿了 #路飞#海贼王
00:41
路飞与唐舞桐
Рет қаралды 25 МЛН