การจัดการหน่วยความจำอัตโนมัติของ Rust ช่วยให้นักพัฒนาเป็นอิสระจากการจัดการพอยน์เตอร์ และป้องกันปัญหาที่เกิดจากการจัดการหน่วยความจำระดับต่ำ เช่น การเข้าถึงหน่วยความจำหลังจากว่าง การยกเลิกการอ้างอิงพอยน์เตอร์ null บัฟเฟอร์โอเวอร์รัน และอื่นๆ ที่คล้ายกัน ตัวจัดการแพ็คเกจกำลังได้รับการพัฒนาเพื่อแจกจ่ายไลบรารี ตรวจสอบการประกอบและจัดการการพึ่งพาโดยโปรเจ็กต์
หลัก
- เพิ่มโหมดการคอมไพล์ไปป์ไลน์ (ไปป์ไลน์) ซึ่งการสร้างแพ็คเกจลังที่ขึ้นต่อกันจะเริ่มต้นทันทีที่ข้อมูลเมตาการขึ้นต่อกันพร้อมใช้งาน โดยไม่ต้องรอให้การคอมไพล์เสร็จสิ้น เมื่อรวบรวมแพ็คเกจ ไม่จำเป็นต้องประกอบการขึ้นต่อกันอย่างสมบูรณ์ เพียงกำหนดข้อมูลเมตาซึ่งรวมถึงรายการประเภท การขึ้นต่อกัน และองค์ประกอบที่ส่งออก ข้อมูลเมตาจะพร้อมใช้งานตั้งแต่เนิ่นๆ ของกระบวนการคอมไพล์ ดังนั้น แพ็คเกจที่เชื่อมโยงจึงสามารถคอมไพล์ได้เร็วกว่ามาก เมื่อสร้างแพ็คเกจเดี่ยว โหมดที่เสนอจะไม่ส่งผลต่อประสิทธิภาพ แต่หากบิลด์ครอบคลุมแพ็คเกจที่มีการพึ่งพาแบบแยกสาขา เวลาในการสร้างโดยรวมจะลดลง 10-20%
- ช่วยให้มั่นใจได้ถึงการตรวจจับการใช้ฟังก์ชันที่ไม่ถูกต้อง
std::mem::ไม่ได้กำหนดค่าเริ่มต้น иมาตรฐาน::mem::ศูนย์ . ตัวอย่างเช่น std::mem::uninitialized สะดวกสำหรับการสร้างอาร์เรย์อย่างรวดเร็ว แต่จะทำให้คอมไพลเลอร์เข้าใจผิดเนื่องจากดูเหมือนว่าจะเตรียมใช้งาน แต่ในความเป็นจริงแล้ว ค่ายังคงไม่ได้เตรียมใช้งาน ฟังก์ชั่น mem::uninitialized ถูกทำเครื่องหมายว่าเลิกใช้แล้ว และขอแนะนำให้ใช้ประเภทกลางแทนบางทียูนิต . สำหรับ mem::zeroed ฟังก์ชันนี้อาจทำให้เกิดปัญหากับประเภทที่ไม่สามารถยอมรับค่าศูนย์ได้เพื่อช่วยระบุพฤติกรรมที่ไม่ได้กำหนด รุ่นใหม่จะเพิ่มการตรวจสอบผ้าสำลีให้กับคอมไพเลอร์ที่ตรวจพบปัญหาบางอย่างกับ mem::unitialized หรือ mem::zeroed ตัวอย่างเช่น ตอนนี้คุณได้รับข้อผิดพลาดเมื่อพยายามใช้ mem::unitialized หรือ mem::zeroed ด้วยประเภท &T และ Box‹T› ซึ่งแสดงถึงวัตถุตัวชี้ที่ไม่สามารถยอมรับค่า Null ได้
- แอตทริบิวต์ “#[deprecated]” ได้รับการขยายเพื่อให้สามารถทำเครื่องหมายบรรจุภัณฑ์แบบลังว่าล้าสมัยและกำหนดเวลาสำหรับการลบในอนาคต ตั้งแต่ Rust 1.38 คุณลักษณะนี้สามารถใช้กับมาโครได้เช่นกัน
- เพิ่มความสามารถในการใช้แอตทริบิวต์ “#[global_allocator]” ในโมดูลย่อย
- เพิ่มคุณสมบัติแล้ว
มาตรฐาน::ใด ๆ ::type_name ซึ่งช่วยให้คุณค้นหาชื่อประเภทซึ่งอาจมีประโยชน์สำหรับการแก้ไขจุดบกพร่อง ตัวอย่างเช่น ในระหว่างการทำงานของโปรแกรม คุณสามารถดูได้ว่าฟังก์ชันนี้เรียกว่าประเภทใด:fn gen_value‹T: ค่าเริ่มต้น>() -› T {
println!("กำลังเริ่มต้นอินสแตนซ์ของ {}", std::any::type_name::‹T›());
ค่าเริ่มต้น::ค่าเริ่มต้น()
}fnmain() {
ให้ _: i32 = gen_value(); # "i32" จะถูกพิมพ์
ให้ _: String = gen_value(); # จะพิมพ์ "alloc::string::String"
} - ฟังก์ชั่นเพิ่มเติมของไลบรารีมาตรฐาน:
- ชิ้น :: {concat, เชื่อมต่อ, เข้าร่วม} ตอนนี้สามารถรับค่า &[T] นอกเหนือจาก &T;
- ตอนนี้ "*const T" และ "*mut T" ใช้ marker::Unpin;
- "Arc‹[T]›" และ "Rc‹[T]›" ตอนนี้ใช้ FromIterator‹T›;
- iter::{StepBy, Peekable, Take} ตอนนี้ใช้ DoubleEndedIterator
- ascii::EscapeDefault ใช้ Clone และ Display
- ส่วนใหม่ของ API ได้ถูกถ่ายโอนไปยังหมวดหมู่ที่เสถียร รวมถึงวิธีการที่ได้รับความเสถียรด้วย
- ‹*const T›::ส่ง, ‹*mut T›::ส่ง,
- ระยะเวลา::as_secs_f{32|64},
- ระยะเวลา::div_duration_f{32|64},
- ระยะเวลา::div_f{32|64},
- ระยะเวลา::from_secs_f{32|64},
- ระยะเวลา::mul_f{32|64},
- การดำเนินการหารด้วยส่วนที่เหลือ
div_euclid และ rem_euclid สำหรับจำนวนเต็มดั้งเดิมทั้งหมด
- เพิ่มการรองรับสำหรับการระบุตัวเลือก “--คุณสมบัติ” หลายครั้งเพื่อเปิดใช้งานคุณสมบัติที่แตกต่างกันในตัวจัดการแพ็คเกจสินค้า
- คอมไพเลอร์จัดเตรียมส่วนที่สาม
ชั้น รองรับแพลตฟอร์มเป้าหมาย aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc เป้าหมาย, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl และ riscv32i-unknown-none-elf ระดับที่สามเกี่ยวข้องกับการสนับสนุนขั้นพื้นฐาน แต่ไม่มีการทดสอบอัตโนมัติและการเผยแพร่งานสร้างอย่างเป็นทางการ
ที่มา: opennet.ru