ความแตกต่างระหว่าง std :: resize (n) และ std :: shrink_to_fit ใน C ++?


11

ฉันเจอข้อความเหล่านี้:

resize(n)- ปรับขนาดภาชนะเพื่อให้มีองค์ประกอบ 'n'
shrink_to_fit()- ลดความจุของภาชนะบรรจุให้พอดีกับขนาดและทำลายส่วนประกอบทั้งหมดเกินความจุ

มีความแตกต่างที่สำคัญระหว่างฟังก์ชั่นเหล่านี้หรือไม่? พวกมันมาอยู่ใต้เวกเตอร์ใน c ++


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

2
ตู้คอนเทนเนอร์แบบมาตรฐานมีขนาดและความจุ ขนาดคือจำนวนองค์ประกอบปัจจุบันในคอนเทนเนอร์ในขณะที่ความจุคือจำนวนหน่วยความจำที่จัดสรร (คร่าวๆ) การปรับขนาดเปลี่ยนขนาดshrink_to_fitเปลี่ยนความจุ
โปรแกรมเมอร์บางคนเพื่อน

2
คุณเข้าใจความแตกต่างระหว่างcapacityและsize?
ลูกบาศก์

คำตอบ:


12

เวกเตอร์มีแอตทริบิวต์ "ยาว" สองรายการซึ่งหมายถึงสิ่งต่าง ๆ :

  • sizeคือจำนวนองค์ประกอบที่ใช้งานได้ในเวกเตอร์ มันคือจำนวนของสิ่งที่คุณเก็บไว้ นี่คือความยาวแนวความคิด
  • capacity คือจำนวนองค์ประกอบที่จะพอดีกับจำนวนหน่วยความจำที่เวกเตอร์ได้จัดสรรไว้ในปัจจุบัน

capacity >= sizeต้องเป็นจริงเสมอ แต่ไม่มีเหตุผลที่ทำให้พวกเขาเสมอกัน ตัวอย่างเช่นเมื่อคุณลบองค์ประกอบการลดขนาดการจัดสรรจะต้องสร้างการจัดสรรใหม่หนึ่งที่เก็บข้อมูลที่เล็กลงและย้ายเนื้อหาที่เหลือไป ("จัดสรรย้ายฟรี")

ในทำนองเดียวกันถ้าcapacity == sizeและคุณเพิ่มองค์ประกอบเวกเตอร์สามารถขยายการจัดสรรโดยองค์ประกอบหนึ่ง (การดำเนินการ "จัดสรรย้ายฟรี") แต่โดยทั่วไปคุณจะต้องเพิ่มองค์ประกอบมากกว่าหนึ่งองค์ประกอบ หากความต้องการจำเป็นต้องเพิ่มขึ้นเวกเตอร์จะเพิ่มกำลังการผลิตมากกว่าหนึ่งองค์ประกอบเพื่อให้คุณสามารถเพิ่มองค์ประกอบอีกหลายองค์ประกอบก่อนที่จะต้องการย้ายทุกอย่างอีกครั้ง

ด้วยความรู้นี้เราสามารถตอบคำถามของคุณ:

  • std::vector<T>::resize()เปลี่ยนขนาดของอาเรย์ หากคุณปรับขนาดให้เล็กกว่าขนาดปัจจุบันวัตถุส่วนเกินจะถูกทำลาย หากคุณปรับขนาดให้ใหญ่กว่าขนาดปัจจุบันวัตถุ "ใหม่" ที่เพิ่มในตอนท้ายจะถูกกำหนดเป็นค่าเริ่มต้น
  • std::vector<T>::shrink_to_fit()ขอให้กำลังการผลิตมีการเปลี่ยนแปลงเพื่อให้ตรงกับขนาดปัจจุบัน (การนำไปปฏิบัติอาจหรือไม่ปฏิบัติตามคำขอนี้พวกเขาอาจลดกำลังการผลิต แต่ไม่ทำให้เท่ากับขนาดพวกเขาอาจไม่ทำอะไรเลย) หากทำตามคำขอแล้วสิ่งนี้จะยกเลิกบางส่วนหรือทั้งหมดของ การจัดสรรเวกเตอร์ โดยปกติแล้วคุณจะใช้สิ่งนี้เมื่อสร้างเวกเตอร์เสร็จแล้วและจะไม่เพิ่มรายการอื่นเข้าไปอีก (ถ้าคุณรู้ล่วงหน้าว่าจะเพิ่มไอเท็มจำนวนเท่าใดจะเป็นการดีกว่าถ้าใช้std::vector<T>::reserve()บอกเวกเตอร์ก่อนที่จะเพิ่มไอเท็มใด ๆ แทนที่จะพึ่งพาshrink_to_fitการทำอะไร)

ดังนั้นคุณจึงใช้resize()เพื่อเปลี่ยนแปลงสิ่งที่เป็นแนวคิดในเวกเตอร์

คุณใช้shrink_to_fit()เพื่อลดพื้นที่ส่วนเกินที่เวกเตอร์จัดสรรภายในโดยไม่ต้องเปลี่ยนว่าเนื้อหานั้นมีแนวคิดในเวกเตอร์เท่าใด


2
โปรดทราบว่าshrink_to_fitไม่ใช่ทั้งหมดหรือไม่มีอะไรเลย การใช้งานอาจลดความจุส่วนวิธี ตัวอย่างเช่นพิจารณาการนำไปใช้งานซึ่งจำกัดความสามารถของเวกเตอร์เป็นกำลังสอง
François Andrieux

5

shrink_to_fit() - ลดความจุของภาชนะบรรจุให้พอดีกับขนาดและทำลายองค์ประกอบทั้งหมดเกินความจุ

นั่นคือการเปลี่ยนลักษณะที่ผิดของสิ่งที่เกิดขึ้น Secifically ทำลายองค์ประกอบทั้งหมดเกินกว่าส่วนความสามารถไม่ถูกต้อง

ใน C ++ เมื่อหน่วยความจำแบบไดนามิกถูกใช้สำหรับวัตถุมีสองขั้นตอน:

  1. จัดสรรหน่วยความจำสำหรับวัตถุ
  2. วัตถุถูกเตรียมใช้งาน / สร้างที่ตำแหน่งหน่วยความจำ

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

  1. วัตถุที่ตำแหน่งหน่วยความจำถูกทำลาย (สำหรับชนิดในตัวนี่คือ noop)
  2. หน่วยความจำที่ใช้โดยวัตถุถูกจัดสรรคืน

หน่วยความจำที่จัดสรรเกินขนาดของคอนเทนเนอร์เป็นเพียงบัฟเฟอร์ พวกเขาไม่ได้ถือวัตถุเริ่มต้นอย่างถูกต้องใด ๆ มันเป็นเพียงความทรงจำดิบ shrink_to_fit()ตรวจสอบให้แน่ใจว่าไม่มีหน่วยความจำเพิ่มเติม แต่ไม่มีวัตถุในตำแหน่งที่ตั้งเหล่านั้น ดังนั้นไม่มีสิ่งใดถูกทำลายหน่วยความจำเท่านั้นที่ถูกจัดสรรคืน


2

ตามมาตรฐาน C ++ เทียบกับ shrink_to_fit

ผลกระทบ: shrink_to_fit เป็นคำขอที่ไม่มีผลผูกพันเพื่อลดความจุ () เป็นขนาด ()

และเกี่ยวข้องกับ resize

ผลกระทบ: หาก sz <size () ลบองค์ประกอบขนาดสุดท้าย () - sz ออกจากลำดับ มิฉะนั้นผนวกองค์ประกอบขนาด sz () เริ่มต้นแทรกลงในลำดับ

เห็นได้ชัดว่าฟังก์ชั่นทำสิ่งต่าง ๆ ยิ่งกว่านั้นฟังก์ชันแรกไม่มีพารามิเตอร์ในขณะที่ฟังก์ชันที่สองมีสองพารามิเตอร์ ฟังก์ชันshrink_to_fitไม่เปลี่ยนแปลงขนาดของคอนเทนเนอร์แม้ว่าสามารถจัดสรรหน่วยความจำใหม่ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.