หน่วยความจำแบบไดนามิก

ในบทก่อนหน้าของบทเรียนนี้ คุณได้เห็นแล้วว่าหน่วยความจำต้องถูกจองก่อนสำหรับตัวแปร ก่อนที่โปรแกรมจะรัน ในบางกรณี เราอาจจะต้องการจองหน่วยความจำแบบไดนามิกส์ในเวลาที่โปรแกรมรัน

ในบทนี้ การจองหน่วยความจำแบบไดนามิส์ ในภาษา C++ นั้นให้เราสามารถจัดการกับหน่วยความจำได้ในเวลาที่โปรแกรมทำงาน เช่น การจองหน่วยความจำ และการคืนหน่วยความจำให้กับระบบ

Operators new and new[]

เราสามารถจัดสรรหน่วยความจำแบบไดนามิกโดยการใช้คำสั่ง new สำหรับตัวแปรปกติ และ new[]สำหรับอาเรย์ นี่จะส่งค่าพอยน์เตอร์ที่พอยน์เตอร์ชี้ไปยังตำแหน่งเริ่มต้นของตัวแปร คุณสามารถทำตามรูปแบบของมันได้ดังนี้:

int * mypointer;
mypointer = new int [5];

ในตัวอย่าง การจัดสรรหน่วยความจำแบบไดนามิกสำหรับตัวแปรแบบ integer 5 ตัวแปร ตอนแรกเราประกาศ mypointer ซึ่งประเภทของมันต้องตรงกันกับค่าของข้อมูลที่เราจะจัดสรรหน่วยความจำให้, int อันที่สองเราใช้คำสั่งnew เพื่อจัดสรรหน่วยความจำที่มีขนาด 5 และใส่ขนาดภายในวงเล็บ[] ซึ่งสามารถเป็นจำนวนเต็มบวก หลังจากนั้นพอยน์เตอร์จะชี้ไปยังตำแหน่งแรกของหน่วยความจำที่ได้จองไว้แล้ว

Operators delete and delete[]

โดยปกติ โปรแกรมจะคืนค่าหน่วยความจำให้ระบบหลังจากที่โปรแกรมสิ้นสุดการทำงานอย่างสมบูรณ์ แต่บางครั้งเราได้เสร็จสิ้นงานของเราขณะเดียวกันโปรแกรมยังไม่จบ เราสามารถคืนค่าหน่วยความจำที่เราได้จองไว้โดยการใช้คำสั่ง delete:

delete mypointer;
delete[] mypointer;

บรรทักแรกเราคืนค่าหน่วยความจำสำหรับตัวแปร และบรรทัดที่สองสำหรับอาเรย์ หลังจากนั้นหน่วยความจำจะคืนสู่ระบบและสามารถนำไปใช้อย่างอื่นได้

มาดูตัวอย่างกับการใช้การจองหน่วยความจำแบบไดนามิก

#include <iostream>
#include <new>
using namespace std;

int main ()
{
int i,n;
int * p;
cout << "How much memory would you like to allocate? ";
cin >> n;
p= new (nothrow) int[n];
if (p == NULL)
cout << "Error: memory could not be allocated";
else {
for (i = 0; i < n; i++) {
cout << "Enter p[" << i << "]: ";
cin >> p[i];
}
cout << "You have entered: ";
for (i = 0; i < n; i++)
cout << p[i] << ", ";
delete[] p;
}
return 0;
}

Output

How much memory would you like to allocate? 5
Enter number for p[0]: 1
Enter number for p[1]: 2
Enter number for p[2]: 3
Enter number for p[3]: 4
Enter number for p[4]: 5
You have entered: 1, 2, 3, 4, 5,

ในตัวอย่างนี้ เราได้เขียนโปรมแบบไดนามิกที่จะถามถึงขนาดที่เราต้องการสร้าง หลังจากนั้นเราจะจองหน่วยความจำแบบไดนามิกกับขนาดที่ใส่เข้ามา หน่วยความจำแบบไดนามิกนั้นเหมือนอาเรย์ ซึ่งมันเป็นลำดับของหน่วยความจำ เมื่อเราเสร็จสิ้นงานของเรา เราจะคืนค่าหน่วยความจำที่เราได้จองไว้

Dynamic array Vs. Array

ในตัวอย่างก่อนหน้า คุณจะเห็นว่าตัวแปรที่เราสร้างนั้นเหมือนกับอาเรย์ แน่นอนว่ามันคืออาเรย์ แต่เป็นอาเรย์แบบไดนามิกส์หรือพอยน์เตอร์อาเรย์ อาเรย์ประเภทนี้แตกต่างจากอาเรย์ปกติก็คือการเก็บข้อมูลในหน่วยความจำ ซึ่งในการใช้งานอาเรย์แบบปกติของเรานั้นจะต้องประกาศขนาดของอาเรย์ให้เท่ากับขนาดสูงสุดของข้อมูลที่จะมีได้ในอาเรย์ก่อน ทำให้หน่วยความจำทั้งหมดถูกจองไว้ แต่สำหรับไดนามิกส์อาเรย์นั้นจะใช้พื้นที่หน่วยความจำเท่ากับขนาดของข้อมูลจริงๆ ที่มีอยู่ มาดูตัวอย่าง

#include <iostream>

using namespace std;

int main () {

const int SIZE = 10;

// formal array
int number[SIZE];

// dynamic array
int * mypointer;
mypointer = new int [SIZE];

cout << "Empty arrays" << endl;
cout << "Size dynamic array = "
<< sizeof(int) * 0 + sizeof(mypointer) << endl;
cout << "Size array = " << sizeof(number) << endl;

for (int i = 0; i < 3; i++) {
mypointer[i] = 1;
number[i] = 1;
}

cout << "\nAdded 3 items to arrays" << endl;
cout << "Size dynamic array = "
<< sizeof(int) * 3 + sizeof(mypointer) << endl;
cout << "Size array = " << sizeof(number) << endl;

for (int i = 3; i < 10; i++) {
mypointer[i] = 1;
number[i] = 1;
}

cout << "\nAdded 10 items to arrays" << endl;
cout << "Size dynamic array = "
<< sizeof(int) * 10 + sizeof(mypointer) << endl;
cout << "Size array = " << sizeof(number) << endl;

delete[] mypointer;

return 0;
}

ในตัวอย่าง เป็นโปรแกรมในการแสดงผลความแตกต่างระหว่างไดนามิกส์อาเรย์และอาเรย์แบบปกติ ในตอนแรกของโปรแกรมเราได้สร้างอาเรย์ขนาดปกติสำหรับเก็บตัวเลขแบบ Integer จำนวน 10 ตัว หลังจากนั้นสร้างไดนามิกส์อาเรย์สำหรับเก็บตัวเลขเช่นกัน

// formal array
int number[SIZE];

// dynamic array
int * mypointer;
mypointer = new int [SIZE];

ในการสร้างอาเรย์ทั้งสองแบบ ในอาเรย์ปกติโปรแกรมจะจองหน่วยความจำสำหรับ 10 ตัวเลขในตอนที่สร้างทันที และสำหรับไดนามิกส์อาเรย์โปรแกรมจะจองเพียงหน่วยความจำของตัวแปรพอยน์เตอร์ที่ชี้ไปยังตำแหน่งแรก (ส่วนหัว) ของเรย์ หลังจากนั้นเราได้แสดงขนาดของหน่วยความจำจริงๆ ที่ใช้เก็บข้อมูลของอาเรย์ทั้งสองแบบโดยใช้ฟังก์ชัน sizeof() สำหรับหาขนาดของออบเจ็ค และนี่เป็นผลลัพธ์ของโปรแกรม

Empty arrays
Size dynamic array = 4
Size array = 40

Added 3 items to arrays
Size dynamic array = 16
Size array = 40

Added 10 items to arrays
Size dynamic array = 44
Size array = 40

จากผลลัพธ์ของโปรแกรม แสดงให้คุณเห็นว่าขนาดของการเก็บแบบอาเรย์ปกติสำหรับตัวเลข 10 ตัวนั้นจะคงที่เสมอ ซึ่งเป็นขนาดสูงสุดที่เราได้จองไว้ในอาเรย์ ส่วนขนาดของหน่วยความจำที่ใช้ในไดนามิกส์อาเรย์นั้นจะเพิ่มขึ้นตามจำนวนของข้อมูลที่มีอยู่ และจะบวกเพิ่มขึ้นอีก 4 bytes สำหรับตัวแปรพอยน์ของอาเรย์ ดังนั้น คุณพอจะเห็นประสิทธิภาพของโปรแกรมว่าวิธีไหนจะดีกว่าถ้าหากเราต้องการเขียนโปรแกรมให้ประหยัดหน่วยความจำใน run-time

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับประเภทข้อมูลแบบไดนามิกส์ในภาษา C++ สำหรับเก็บข้อมูลในหน่วยความจำให้มีประสิทธิภาพมากขึ้นจากอาเรย์แบบปกติ อย่างไรก็ตามในการใช้งานจริง คุณควรจะพิจารณาโปรแกรมและความจำเป็นของคุณในการใช้งานแต่ละแบบ และสิ่งที่สำคัญของบทนี้คุณได้รู้ข้อแตกต่างของพวกเขา


บทความเกี่ยวกับ หน่วยความจำแบบไดนามิก

แนะนำภาษา C ในภาษา C

ในบทเรียนนี้ คุณจะได้เรียนภาษา C เบื้องต้น สิ่งแรกที่คุณต้องรู้คือภาษา C คืออะไร ภาษา C เป็นภาษาคอมพิวเตอร์เพื่อวัตถุประสงค์ทั่วไป เป็นภาษาที่มีความจำเป็นมาก มั...

แนะนำภาษา PHP ในภาษา PHP

ในบทแรกของการเรียนภาษา PHP เราจะแนะนำให้คุณรู้จักกับภาษาในเบื้องต้น รวมทั้งประวัติความเป็นมาและการพัฒนาของภาษา PHP PHP คือภาษาสำหรับทำงานด้านฝั่งของเซิร์ฟเวอร์ ...

ทำความรู้จักกับภาษา Java ในภาษา Java

Java เป็นภาษาเขียนโปรแกรมเพื่อวัตถุประสงค์ทั่วไป โดยสามารถทำงานได้พร้อมกัน เป็นภาษาที่สร้างมาจากคลาส และสนับสนุนการเขียนโปรแกรมแบบออบเจ็คอย่างสมบูรณ์ และถูกออก...

แนะนำภาษา Visual Basic ในภาษา Visual Basic

นี่เป็นบทแรกของการเรียนภาษา Visual Basic ก่อนที่จะเริ่มต้นกับการเขียนโปรแกรม เราจะแนะนำให้คุณรู้จักภาษา Visual Basic และประวัติความเป็นมาของภาษาก่อน และเราจะอธิ...

แนะนำให้รู้จักกับภาษา C# ในภาษา C#

ในบทเรียนนี้ คุณจะได้เรียนเกี่ยวกับภาษา C# ในพื้นฐาน ไปจนถึงขั้นสูงกับการเขียนโปรแกรมเชิงวัตถุ ก่อนที่คุณจะเริ่ม เราจะแนะนำให้คุณรู้จักกับภาษา C# เสียก่อน C# เป...