GCC (GNU Compiler Collection) เป็นซอฟต์แวร์บรรทัดคำสั่งแบบโอเพ่นซอร์สที่ออกแบบมาเพื่อทำหน้าที่เป็นคอมไพเลอร์สำหรับระบบปฏิบัติการที่ใช้ GNU / Linux และ BSD รวมถึง Objective-C, Go, C ++, Java, C, Ada และ Fortran
คุณสมบัติได้อย่างรวดเร็ว
ด้วย GCC คุณสามารถกำหนดค่าคอมไพล์และติดตั้งแอพพลิเคชัน GNU / Linux ใน Linux หรือ BSD โดยใช้ที่เก็บเฉพาะของโปรแกรมนั้น ๆ อย่างไรก็ตามผู้ใช้ไม่จำเป็นต้องโต้ตอบกับคอมไพเลอร์เนื่องจากจะทำโดยอัตโนมัติด้วยการกำหนดค่าและสร้างสคริปต์
โครงการนี้มีไลบรารีสำหรับภาษาโปรแกรมต่างๆเช่น libstdc และ libgcj และเหมือนซอฟต์แวร์ GNU ส่วนใหญ่จะต้องมีการกำหนดค่าก่อนที่จะสามารถสร้างและติดตั้งลงในคอมพิวเตอร์ของคุณได้
นอกจากนี้ยังสามารถแสดงพา ธ เต็มรูปแบบไปยังไลบรารีโฟลเดอร์ในเส้นทางการค้นหาของคอมไพเลอร์เส้นทางแบบเต็มไปยังคอมโพเนนต์เฉพาะไดเร็กทอรีไลบรารีเป้าหมาย suffix sysroot ที่ใช้ค้นหาส่วนหัวและเป้าหมายของ GNU tripulated ปกติ
นอกจากนี้ยังมีตัวเลือกอื่น ๆ สำหรับการส่งผ่านตัวเลือกและอาร์กิวเมนต์ที่คั่นด้วยเครื่องหมายจุลภาคบางอย่างไปที่แอสเซมเบลอร์ตัวประมวลผลและตัวเชื่อมรวบรวมและรวบรวมโดยไม่ต้องเชื่อมโยงสร้างไลบรารีที่ใช้ร่วมกันและอื่น ๆ อีกมากมาย
ออกแบบมาสำหรับระบบปฏิบัติการ GNU
การเขียนเป็นคอมไพเลอร์หลักสำหรับระบบปฏิบัติการ GNU GCC (GNU Compiler Collection) ได้รับการพัฒนาให้เป็นซอฟต์แวร์ฟรี 100% และได้รับการติดตั้งโดยดีฟอลต์ในการแจกจ่าย Linux ใด ๆ
ซอฟต์แวร์นี้ยังใช้โดยนักพัฒนาซอฟต์แวร์โอเพ่นซอร์สเพื่อรวบรวมโปรแกรมของพวกเขา บรรทัดคำสั่งมาพร้อมกับตัวเลือกต่างๆซึ่งเราสามารถพูดถึงความสามารถในการแสดงตัวประมวลผลเป้าหมายของคอมไพเลอร์เช่นเดียวกับเส้นทางที่สัมพันธ์กับไลบรารีระบบปฏิบัติการ
บรรทัดด้านล่าง
ทั้งหมดนี้ GCC เป็นองค์ประกอบที่สำคัญที่สุดของระบบปฏิบัติการ GNU / Linux ไม่เพียง แต่เราสามารถจินตนาการโลกได้โดยไม่ต้องมี แต่ GCC คือเหตุผลหลักที่อยู่เบื้องหลังระบบนิเวศของโอเพนซอร์สทั้งหมด
มีอะไรใหม่ ในรุ่นนี้: p>GCC 7.3 เป็นโปรแกรมแก้ไขข้อบกพร่องจาก GCC 7 ซึ่งมีการแก้ไขที่สำคัญสำหรับการถดถอยและข้อผิดพลาดร้ายแรงใน GCC 7.2 ที่มีมากกว่า 99 ข้อบกพร่องตั้งแต่รุ่นก่อน ๆ
มีอะไรใหม่ ในเวอร์ชัน 8.1.0:
- GCC 7.3 เป็นโปรแกรมแก้ไขข้อบกพร่องจาก สาขา GCC 7 ที่มีการแก้ไขที่สำคัญสำหรับการถดถอยและข้อบกพร่องร้ายแรงใน GCC 7.2 ที่มีบั๊กมากกว่า 99 ข้อที่แก้ไขตั้งแต่ก่อนหน้านี้
- รุ่นนี้มีตัวเลือกการสร้างโค้ดเพื่อลด Specter Variant 2 (CVE 2017-5715) สำหรับเป้าหมาย x86 และ powerpc
มีอะไรใหม่ ในเวอร์ชัน:
- GCC 7.1 เป็นเวอร์ชันหลักที่มีฟังก์ชันการทำงานใหม่ ๆ ที่ไม่มีใน GCC 6.x หรือ GCC เวอร์ชันก่อนหน้า ตอนนี้ C ++ frontend มีการสนับสนุนการทดลองสำหรับ c + + 17 ฉบับร่างทั้งหมดโดยมีตัวเลือก -std = c ++ 1z และ -std = gnu ++ 1z และไลบรารี libstdc ++ มี c ++ 17 ฉบับร่างมากที่สุด ไลบรารีที่ใช้งานได้ดีเช่นกัน รุ่นนี้มีการปรับปรุงที่ดีขึ้นในการวินิจฉัยที่ปล่อยออกมาซึ่งรวมถึงตำแหน่งที่ตั้งที่ดีขึ้นช่วงตำแหน่งข้อเสนอแนะสำหรับตัวระบุที่สะกดผิดชื่อตัวเลือกคำแนะนำในการแก้ไขและคำเตือนใหม่ ๆ ได้รับการเพิ่ม เพิ่มประสิทธิภาพได้รับการปรับปรุงโดยมีการปรับปรุงที่เกิดขึ้นในการเพิ่มประสิทธิภาพภายในและระหว่างกระบวนการทั้งหมดการเพิ่มประสิทธิภาพของเวลาในการเชื่อมโยงและแบ็กเอนด์เป้าหมายต่างๆรวมถึง แต่ไม่ จำกัด เฉพาะการเพิ่มการผสานรวมการจัดเก็บการเพิ่มประสิทธิภาพการเพิ่มประสิทธิภาพของรหัสการแยกวงและการหดตัว การปรับปรุงการห่อ ที่อยู่ Sanitizer สามารถรายงานการใช้ตัวแปรหลังจากออกจากขอบเขตของพวกเขา ตอนนี้ GCC สามารถกำหนดค่าให้ OpenMP 4.5 offloading เป็น NVIDIA PTX GPGPUs ได้
มีอะไรใหม่ ในเวอร์ชัน 6.3.0:
- GCC 6.3 เป็นโปรแกรมแก้ไขข้อบกพร่องจาก GCC 6 ซึ่งมีการแก้ไขที่สำคัญสำหรับการถดถอยและข้อผิดพลาดร้ายแรงใน GCC 6.2 ที่มีมากกว่า 79 ข้อบกพร่องตั้งแต่รุ่นก่อนหน้านี้
มีอะไรใหม่ ในเวอร์ชัน 6.2.0:
- รุ่นนี้เป็นรุ่นสำหรับแก้ไขข้อบกพร่องโดยมีการแก้ไขปัญหาการถดถอยใน GCC 5.2 เทียบกับรุ่นก่อน ๆ ของ GCC
มีอะไรใหม่ ในเวอร์ชัน 6.1.0:
- รุ่นนี้เป็นรุ่นสำหรับแก้ไขข้อบกพร่องโดยมีการแก้ไขปัญหาการถดถอยใน GCC 5.2 เทียบกับรุ่นก่อน ๆ ของ GCC
มีอะไรใหม่ ในเวอร์ชัน 5.3.0:
- รุ่นนี้เป็นรุ่นสำหรับแก้ไขข้อบกพร่องโดยมีการแก้ไขปัญหาการถดถอยใน GCC 5.2 เทียบกับรุ่นก่อน ๆ ของ GCC
มีอะไรใหม่ ในเวอร์ชัน 5.2.0:
- รุ่นนี้เป็นรุ่นสำหรับแก้ไขข้อบกพร่องซึ่งมีการแก้ไขการถดถอยใน GCC 5.1 เทียบกับรุ่นก่อนหน้าของ GCC
มีอะไรใหม่ ในเวอร์ชัน 5.1.0:
- ส่วนหน้าของ C ++ มีการสนับสนุนภาษา C + + 14 เต็มรูปแบบและ Standard C ++ Library มีการสนับสนุน C + + + เต็มรูปแบบและการสนับสนุน C + + + 14 เต็มรูปแบบ การสนับสนุน C + + + 11 เต็มรูปแบบเป็นไปได้โดยการใช้ Dual ABI ดูรายละเอียดเพิ่มเติมที่ https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
- ส่วนหน้า C ตอนนี้เริ่มต้นเป็นโหมด C11 โดยมีส่วนขยาย GNU ซึ่งมีผลต่อความหมายของคำหลักแบบอินไลน์และนำการเปลี่ยนแปลงอื่น ๆ ที่ผู้ใช้มองเห็นได้ไปดู https://gcc.gnu.org/gcc-5/porting_to.html สำหรับรายละเอียดเพิ่มเติม
- GCC 5.1 มีการเพิ่มประสิทธิภาพการปรับปรุงประสิทธิภาพแบบ interprocedural หลายอย่างเช่น รหัสผ่านการส่งผ่านรหัสแบบเดิมของ IPA ฉบับใหม่และการปรับปรุง LTO ต่างๆเช่น การผสานรวม C + + ของ ODR ดู http://hubicka.blogspot.cz/2015/04/GCC5-IPA-LTO-news.html สำหรับรายละเอียดเพิ่มเติม
- GCC 5.1 Local Register Allocator มีโครงสร้างย่อยย่อยที่แยกตัวออกจากเดิมโดยใช้ i? 86 / x86-64 สามารถใช้รีจีสเตอร์ PIC ลงทะเบียนซ้ำเพื่อปรับปรุงประสิทธิภาพของรหัสตำแหน่งได้โดยง่ายมีรหัสผ่าน RA แบบ interprocedural และ register อื่น ๆ เพิ่มการจัดสรรแล้ว
- GCC 5.1 เพิ่มการสนับสนุนบางส่วนสำหรับมาตรฐาน OpenACC การสนับสนุน OpenMP 4.0 สำหรับเครื่องเร่งอนุภาค Xeon Phi ของ Intel และการสนับสนุนการถ่ายโอนข้อมูล OpenACC ไปยัง PTX เครื่องกำจัดสิ่งปนเปื้อนที่ไม่ได้กำหนดไว้ใน GCC ได้รับการขยายโดยการเพิ่มการตรวจสอบรันไทม์ใหม่ ๆ มีการเพิ่มห้องสมุด GCC JIT แบบทดลองแล้วใน GCC 5.1
มีอะไรใหม่ ในเวอร์ชัน 4.8.4:
- การเพิ่มประสิทธิภาพเครื่องมือเพิ่มประสิทธิภาพทั่วไป:
- AddressSanitizer ซึ่งเป็นเครื่องตรวจจับข้อผิดพลาดของหน่วยความจำได้อย่างรวดเร็วพร้อมให้บริการแล้วใน ARM
- UndefinedBehaviorSanitizer (ubsan) ซึ่งเป็นเครื่องตรวจจับพฤติกรรมที่ไม่ระบุชื่ออย่างรวดเร็วได้รับการเพิ่มและสามารถใช้งานได้ผ่านทาง -fsanitize = undefined การคำนวณต่างๆจะช่วยในการตรวจจับพฤติกรรมที่ไม่ได้ระบุไว้ในขณะทำงาน UndefinedBehaviorSanitizer ปัจจุบันมีให้บริการสำหรับภาษา C และ C ++
- การปรับปรุงประสิทธิภาพ Link-Time Optimisation (LTO):
- พิมพ์การผสานใหม่ถูกเขียนใหม่ การใช้งานใหม่ทำได้รวดเร็วและใช้หน่วยความจำน้อยลง
- อัลกอริทึมการแบ่งพาร์ติชันที่ดีกว่าทำให้มีสตรีมมิ่งน้อยลงในช่วงเวลาลิงก์
- การนำเอาวิธีเสมือนออกก่อนจะลดขนาดไฟล์ของวัตถุและปรับปรุงการใช้หน่วยความจำและเวลาในการรวบรวมข้อมูลของ link-time
- ตอนนี้หน่วยงานของฟังก์ชันจะถูกโหลดตามความต้องการและเปิดตัวการใช้หน่วยความจำโดยรวมในช่วงต้นของการเชื่อมโยง
- วิธีที่ซ่อนคีย์ C ++ ขณะนี้คุณสามารถปรับให้เหมาะสมได้
- เมื่อใช้ปลั๊กอินเกอร์เกอร์การคอมไพล์ด้วยอ็อพชัน -flto จะสร้างไฟล์อ็อบเจกต์ที่บาง (.o) ซึ่งมีการแทนภาษาระดับกลางสำหรับ LTO เท่านั้น ใช้ -fat-lto-objects เพื่อสร้างไฟล์ที่มีรหัสอ็อบเจ็กต์เพิ่มเติม ในการสร้างไลบรารีแบบสแตติกเหมาะสำหรับการประมวลผลแบบ LTO ให้ใช้ gcc-ar และ gcc-ranlib; เพื่อแสดงสัญลักษณ์จากไฟล์อ็อบเจ็กต์บางเฉียบใช้ gcc-nm (ต้องใช้ ar, ranlib และ nm ที่รวบรวมด้วยการสนับสนุนปลั๊กอิน)
- การใช้หน่วยความจำในการสร้าง Firefox ที่มีการเปิดใช้ดีบักลดลงจาก 15GB เป็น 3.5GB; เวลาเชื่อมโยงจาก 1700 วินาทีเป็น 350 วินาที
- การปรับปรุงประสิทธิภาพขั้นตอน:
- โมดูลการวิเคราะห์การสืบทอดประเภทใหม่ที่ปรับปรุงการ เดี๋ยวนี้ใช้เวลาในการระบุชื่อช่องว่างและคำหลักสุดท้ายของ C + + 11
- ผ่าน devirtualization เก็งกำไรแบบใหม่ (ควบคุมโดย -fdevirtualize-speculatively.
- การโทรที่ถูกคาดเดาโดยตรงจะกลับไปเป็นทางอ้อมซึ่งการโทรทางตรงไม่ใช่เรื่องถูกกว่า
- นามแฝงในระบบจะนำมาใช้กับสัญลักษณ์ที่มีความหมายเทียบเท่าทางความหมายในไลบรารีที่ใช้ร่วมกันเพื่อปรับปรุงเวลาในการเชื่อมโยงแบบไดนามิก
- การปรับปรุงการปรับปรุงการโต้ตอบโดยใช้ข้อมูลป้อนกลับ:
- การกำหนดโปรไฟล์ของโปรแกรมโดยใช้ฟังก์ชันอินไลน์แบบ C + + ตอนนี้น่าเชื่อถือมากขึ้น
- การกำหนดโปรไฟล์ใหม่จะกำหนดลำดับโดยทั่วไปที่มีการเรียกใช้ฟังก์ชันต่างๆ
- ฟังก์ชันการจัดเรียงฟังก์ชันใหม่ (ควบคุมโดย -freorder-functions) ช่วยลดเวลาเริ่มต้นของแอพพลิเคชันที่มีขนาดใหญ่ จนกว่าการสนับสนุน binutils จะเสร็จสมบูรณ์จะมีผลกับการเพิ่มประสิทธิภาพ link-time เท่านั้น
- การกำจัดการโทรทางตรงและการโอนย้ายข้อมูลจะทำให้สามารถจัดการการเรียกข้ามโมดูลเมื่อมีการเปิดใช้งานการเพิ่มประสิทธิภาพ link-time
- การปรับปรุงภาษาและภาษาใหม่เฉพาะ:
- เวอร์ชัน 4.0 ของข้อกำหนด OpenMP ได้รับการสนับสนุนในคอมไพเลอร์ C และ C ++ และเริ่มต้นด้วยการเผยแพร่ 4.9.1 ในฟอร์แทรนคอมไพเลอร์ สามารถใช้ตัวเลือก -fopenmp-simd ใหม่เพื่อเปิดใช้งานคำสั่ง SIMD ของ OpenMP ในขณะที่ไม่สนใจคำสั่ง OpenMP อื่น ๆ ตัวเลือก -fsimd-cost-model = option อนุญาตให้ปรับแต่งรูปแบบค่าใช้จ่าย vectorization สำหรับลูปที่มีคำอธิบายประกอบกับคำสั่ง OpenMP และ Cilk Plus simd; -Wapenmp-simd เตือนเมื่อโมเดลต้นทุนปัจจุบันแทนที่คำสั่ง simd ที่ผู้ใช้กำหนด
- ตัวเลือก -Wdate-time ถูกเพิ่มลงในคอมไพเลอร์ C, C ++ และ Fortran ซึ่งจะแจ้งเตือนเมื่อมีการใช้แมโค __DATE__, __TIME__ หรือ __TIMESTAMP__ มาโครเหล่านี้อาจป้องกันไม่ให้มีการรวบรวมข้อมูลซ้ำซ้อนเหมือนบิต - ฉลาด - เหมือนกัน
- Ada:
- GNAT เปลี่ยนเป็น Ada 2012 แทน Ada 2005 โดยค่าเริ่มต้น
- ครอบครัว C:
- ได้มีการเพิ่มการสนับสนุนการทำสีสำหรับการวินิจฉัยที่ GCC ได้รับ -fdiagnostics-color = auto จะเปิดใช้งานเมื่อส่งข้อมูลไปยังเทอร์มินัล, -fdiagnostics-color = unconditionally เสมอ ตัวแปรสภาพแวดล้อม GCC_COLORS สามารถใช้เพื่อกำหนดสีหรือปิดการใช้สีได้ หากตัวแปร GCC_COLORS มีอยู่ในสภาพแวดล้อมค่าดีฟอลต์คือ -fdiagnostics-color = auto มิฉะนั้น - fdiagnostics-color = never.
- เอาต์พุตการวินิจฉัยตัวอย่าง:
- $ g ++ -fdiagnostics-color = เสมอ -S- ทดสอบด้วย C.
- test.C: ในฟังก์ชัน & lsquo; int foo () ':
- test.C: 1: 14: warning: ไม่มี return statement ในฟังก์ชันที่ส่งกลับไม่ใช่โมฆะ [-Wreturn-type]
- int foo () {}
- test.C: 2: 46: ข้อผิดพลาด: แม่แบบ instantiation ความลึกเกินกว่า 900 (ใช้ -ftemplate-depth = เพื่อเพิ่มจำนวนสูงสุด) instantiating & lsquo; struct X '
- เทมเพลต struct X {static const int value = X :: value; }; แม่แบบ struct X;
- test.C: 2: 46: จำเป็นต้องใช้รีสตาร์ทจาก & lsquo; const int X :: value '
- test.C: 2: 46: ต้องจาก & lsquo; const int X :: value '
- test.C: 2: 88: จำเป็นจากที่นี่
- test.C: 2: 46: error: ไม่สมบูรณ์ประเภท & lsquo; X 'ที่ใช้ในตัวระบุชื่อที่ซ้อนกัน
- ด้วย #pragma GCC ivdep ใหม่ผู้ใช้สามารถยืนยันว่าไม่มีการอ้างอิงข้อมูลที่มีการวนซ้ำซึ่งจะป้องกันไม่ให้มีการทำซ้ำซ้ำตามลำดับโดยใช้คำแนะนำ SIMD (คำแนะนำเดียวหลายข้อมูล)
- การสนับสนุน Cilk Plus ได้รับการเพิ่มและสามารถใช้งานได้โดยใช้ตัวเลือก -fcilkplus Cilk Plus เป็นส่วนขยายของภาษา C และ C ++ เพื่อสนับสนุนข้อมูลและความเท่าเทียมกันของงาน การดำเนินงานในปัจจุบันนี้เป็นไปตาม ABI version 1.2; คุณลักษณะทั้งหมด แต่ _Cilk_for ได้รับการติดตั้งแล้ว
- อะตอม ISO C11 (ตัวระบุและประเภทของตัวระบุชนิดข้อมูลและส่วนหัว) ได้รับการสนับสนุนแล้ว
- ขณะนี้ได้รับการสนับสนุนการเลือกทั่วไปของ ISO C11 (_Generic keyword)
- มีการสนับสนุนการจัดเก็บข้อมูลแบบเธรด (local) ของ ISO C11 (_Thread_local ซึ่งคล้ายกับ GNU C __thread)
- การสนับสนุนของ ISO C11 อยู่ในระดับที่ใกล้เคียงกับการสนับสนุนของ ISO C99: มีข้อบกพร่องแบบ modulo ที่สมบูรณ์มากขึ้น, ตัวระบุเพิ่มเติม (สนับสนุนยกเว้นกรณีมุมเมื่อมีการใช้ตัวระบุแบบยืดเวลา) ปัญหา floating-point (ส่วนใหญ่ แต่ไม่ครบถ้วน เกี่ยวกับคุณสมบัติเสริม C99 จากภาคผนวก F และ G) และภาคผนวก K (ขอบเขตการตรวจสอบอินเตอร์เฟซ) และ L (Analyzability)
- ส่วนขยาย C ใหม่ __auto_type มีชุดย่อยของฟังก์ชันการทำงานของ C ++ 11 อัตโนมัติใน GNU C
- C ++:
- การใช้งาน C ++ 1y สำหรับการทำงานปกติของ G ++ ได้รับการปรับปรุงเพื่อให้เป็นไปตาม N3638 ข้อเสนอที่ยอมรับในเอกสารการทำงาน สิ่งที่น่าสังเกตมากที่สุดคือจะเพิ่ม decltype (auto) สำหรับการรับความหมาย decltype แทนที่จะเป็นเทมเพลตการหักลบความหมายของ auto auto:
- int & amp; f ();
- อัตโนมัติ i1 = f (); // int
- decltype (อัตโนมัติ) i2 = f (); // int & amp;
- G ++ สนับสนุน C ++ 1y การจับภาพ lambda initializer:
- [x = 42] {... };
- จริงๆแล้วพวกเขาได้รับการตอบรับตั้งแต่ GCC 4.5 แต่ตอนนี้คอมไพเลอร์ไม่ได้เตือนเกี่ยวกับพวกเขาด้วย -std = c ++ 1y และสนับสนุน initializers แบบวงเล็บและแบบวงเล็บรวมทั้ง
- G ++ สนับสนุนอาร์เรย์ความยาวที่มีความยาวตัวแปร C ++ 1y G ++ ได้สนับสนุน VLA GNU / C99 เป็นเวลานาน แต่ขณะนี้ยังสนับสนุน initializers และ lambda capture โดยการอ้างอิง ในโหมด c ++ 1y G ++ จะบ่นเกี่ยวกับการใช้ VLA ที่ไม่ได้รับอนุญาตตามมาตรฐานร่างเช่นการสร้างตัวชี้ไปยังประเภท VLA หรือใช้ sizeof กับตัวแปร VLA โปรดสังเกตว่าขณะนี้ VLA จะไม่เป็นส่วนหนึ่งของ C ++ 14 แต่จะเป็นส่วนหนึ่งของเอกสารแยกต่างหากและบางทีอาจเป็น C ++ 17
- เป็นโมฆะ f (int n) {
- int a [n] = {1, 2, 3}; // throws std :: bad_array_length ถ้า n & lt; 3
- [& amp; a] {for (int i: a) {cout
มีอะไรใหม่ ในเวอร์ชัน 4.9.1:
- GCC 4.9.1 เป็นโปรแกรมแก้ไขข้อบกพร่องจาก GCC 4.9 ซึ่งมีการแก้ไขที่สำคัญสำหรับการถดถอยและข้อบกพร่องร้ายแรงใน GCC 4.9.0 ที่มีมากกว่า 88 ข้อบกพร่องตั้งแต่รุ่นก่อน ๆ นอกจากนั้น GCC 4.9.1 release รองรับ OpenMP 4.0 ใน Fortran แทนที่จะเป็นแค่ C และ C ++
มีอะไรใหม่ ในเวอร์ชัน 4.9.0:
- การเพิ่มประสิทธิภาพเครื่องมือเพิ่มประสิทธิภาพทั่วไป:
- AddressSanitizer ซึ่งเป็นเครื่องตรวจจับข้อผิดพลาดของหน่วยความจำได้อย่างรวดเร็วพร้อมให้บริการแล้วใน ARM
- UndefinedBehaviorSanitizer (ubsan) ซึ่งเป็นเครื่องตรวจจับพฤติกรรมที่ไม่ระบุชื่ออย่างรวดเร็วได้รับการเพิ่มและสามารถใช้งานได้ผ่านทาง -fsanitize = undefined การคำนวณต่างๆจะช่วยในการตรวจจับพฤติกรรมที่ไม่ได้ระบุไว้ในขณะทำงาน UndefinedBehaviorSanitizer ปัจจุบันมีให้บริการสำหรับภาษา C และ C ++
- การปรับปรุงประสิทธิภาพ Link-Time Optimisation (LTO):
- พิมพ์การผสานใหม่ถูกเขียนใหม่ การใช้งานใหม่ทำได้รวดเร็วและใช้หน่วยความจำน้อยลง
- อัลกอริทึมการแบ่งพาร์ติชันที่ดีกว่าทำให้มีสตรีมมิ่งน้อยลงในช่วงเวลาลิงก์
- การนำเอาวิธีเสมือนออกก่อนจะลดขนาดไฟล์ของวัตถุและปรับปรุงการใช้หน่วยความจำและเวลาในการรวบรวมข้อมูลของ link-time
- ตอนนี้หน่วยงานของฟังก์ชันจะถูกโหลดตามความต้องการและเปิดตัวการใช้หน่วยความจำโดยรวมในช่วงต้นของการเชื่อมโยง
- วิธีที่ซ่อนคีย์ C ++ ขณะนี้คุณสามารถปรับให้เหมาะสมได้
- เมื่อใช้ปลั๊กอินเกอร์เกอร์การคอมไพล์ด้วยอ็อพชัน -flto จะสร้างไฟล์อ็อบเจ็กต์ slim (.o) ซึ่งมีการแทนภาษาระดับกลางสำหรับ LTO เท่านั้น ใช้ -fat-lto-objects เพื่อสร้างไฟล์ที่มีรหัสอ็อบเจ็กต์เพิ่มเติม ในการสร้างไลบรารีแบบสแตติกเหมาะสำหรับการประมวลผลแบบ LTO ให้ใช้ gcc-ar และ gcc-ranlib; เพื่อแสดงสัญลักษณ์จากไฟล์อ็อบเจ็กต์บางเฉียบใช้ gcc-nm (ต้องการให้ ar, ranlib และ nm ได้รับการคอมไพล์ด้วยการสนับสนุนปลั๊กอิน)
- การใช้หน่วยความจำในการสร้าง Firefox ที่มีการเปิดใช้ดีบักลดลงจาก 15GB เป็น 3.5GB; เวลาเชื่อมโยงจาก 1700 วินาทีเป็น 350 วินาที
- การปรับปรุงประสิทธิภาพขั้นตอน:
- โมดูลการวิเคราะห์การสืบทอดประเภทใหม่ที่ปรับปรุงการ เดี๋ยวนี้ใช้เวลาในการระบุชื่อช่องว่างและคำหลักสุดท้ายของ C + + 11
- ผ่าน devirtualization เก็งกำไรแบบใหม่ (ควบคุมโดย -fdevirtualize-speculatively.
- การโทรที่ถูกคาดเดาโดยตรงจะกลับไปเป็นทางอ้อมซึ่งการโทรทางตรงไม่ใช่เรื่องถูกกว่า
- นามแฝงในระบบจะนำมาใช้กับสัญลักษณ์ที่มีความหมายเทียบเท่าทางความหมายในไลบรารีที่ใช้ร่วมกันเพื่อปรับปรุงเวลาในการเชื่อมโยงแบบไดนามิก
- การปรับปรุงการปรับปรุงการโต้ตอบโดยใช้ข้อมูลป้อนกลับ:
- การกำหนดโปรไฟล์ของโปรแกรมโดยใช้ฟังก์ชันอินไลน์แบบ C + + ตอนนี้น่าเชื่อถือมากขึ้น
- การกำหนดโปรไฟล์ใหม่จะกำหนดลำดับโดยทั่วไปที่มีการเรียกใช้ฟังก์ชันต่างๆ
- ฟังก์ชันการจัดเรียงฟังก์ชันใหม่ (ควบคุมโดย -freorder-functions) ช่วยลดเวลาเริ่มต้นของแอพพลิเคชันที่มีขนาดใหญ่ จนกว่าการสนับสนุน binutils จะเสร็จสมบูรณ์จะมีผลกับการเพิ่มประสิทธิภาพ link-time เท่านั้น
- การกำจัดการโทรทางตรงและการโอนย้ายข้อมูลจะทำให้สามารถจัดการการเรียกข้ามโมดูลเมื่อมีการเปิดใช้งานการเพิ่มประสิทธิภาพ link-time
- การปรับปรุงภาษาและภาษาใหม่เฉพาะ:
- เวอร์ชัน 4.0 ของข้อกำหนด OpenMP ได้รับการสนับสนุนสำหรับคอมไพเลอร์ C และ C ++ สามารถใช้ตัวเลือก -fopenmp-simd ใหม่เพื่อเปิดใช้งานคำสั่ง SIMD ของ OpenMP ในขณะที่ไม่สนใจคำสั่ง OpenMP อื่น ๆ ตัวเลือก -fsimd-cost-model = option อนุญาตให้ปรับแต่งรูปแบบค่าใช้จ่าย vectorization สำหรับลูปที่มีคำอธิบายประกอบกับคำสั่ง OpenMP และ Cilk Plus simd; -Wopenmp-simd เตือนเมื่อโมเดลปัจจุบันแทนที่คำสั่ง simd ที่ผู้ใช้กำหนด
- ตัวเลือก -Wdate-time ถูกเพิ่มลงในคอมไพเลอร์ C, C ++ และ Fortran ซึ่งจะแจ้งเตือนเมื่อมีการใช้แมโค __DATE__, __TIME__ หรือ __TIMESTAMP__ มาโครเหล่านี้อาจป้องกันไม่ให้มีการรวบรวมข้อมูลซ้ำซ้อนเหมือนบิต - ฉลาด - เหมือนกัน
- Ada:
- GNAT เปลี่ยนเป็น Ada 2012 แทน Ada 2005 โดยค่าเริ่มต้น
- ครอบครัว C:
- ได้มีการเพิ่มการสนับสนุนการทำสีสำหรับการวินิจฉัยที่ GCC ได้รับ -fdiagnostics-color = auto จะเปิดใช้งานเมื่อส่งข้อมูลไปยังเทอร์มินัล, -fdiagnostics-color = unconditionally เสมอ ตัวแปรสภาพแวดล้อม GCC_COLORS สามารถใช้เพื่อกำหนดสีหรือปิดการใช้สีได้ หากตัวแปร GCC_COLORS มีอยู่ในสภาพแวดล้อมค่าดีฟอลต์คือ -fdiagnostics-color = auto มิฉะนั้น - fdiagnostics-color = never.
- เอาต์พุตการวินิจฉัยตัวอย่าง:
- $ g ++ -fdiagnostics-color = เสมอ -S- ทดสอบด้วย C.
- test.C: ในฟังก์ชัน & lsquo; int foo () ':
- test.C: 1: 14: warning: ไม่มี return statement ในฟังก์ชันที่ส่งกลับไม่ใช่โมฆะ [-Wreturn-type]
- int foo () {}
- test.C: 2: 46: ข้อผิดพลาด: แม่แบบ instantiation ความลึกเกินกว่า 900 (ใช้ -ftemplate-depth = เพื่อเพิ่มจำนวนสูงสุด) instantiating & lsquo; struct X '
- เทมเพลต struct X {static const int value = X :: value; }; แม่แบบ struct X;
- test.C: 2: 46: จำเป็นต้องใช้รีสตาร์ทจาก & lsquo; const int X :: value '
- test.C: 2: 46: ต้องจาก & lsquo; const int X :: value '
- test.C: 2: 88: จำเป็นจากที่นี่
- test.C: 2: 46: error: ไม่สมบูรณ์ประเภท & lsquo; X 'ที่ใช้ในตัวระบุชื่อที่ซ้อนกัน
- ด้วย #pragma GCC ivdep ใหม่ผู้ใช้สามารถยืนยันว่าไม่มีการอ้างอิงข้อมูลที่มีการวนซ้ำซึ่งจะป้องกันไม่ให้มีการทำซ้ำซ้ำตามลำดับโดยใช้คำแนะนำ SIMD (คำแนะนำเดียวหลายข้อมูล)
- การสนับสนุน Cilk Plus ได้รับการเพิ่มและสามารถใช้งานได้โดยใช้ตัวเลือก -fcilkplus Cilk Plus เป็นส่วนขยายของภาษา C และ C ++ เพื่อสนับสนุนข้อมูลและความเท่าเทียมกันของงาน การดำเนินงานในปัจจุบันนี้เป็นไปตาม ABI version 1.2; คุณลักษณะทั้งหมด แต่ _Cilk_for ได้รับการติดตั้งแล้ว
- อะตอม ISO C11 (ตัวระบุและประเภทของตัวระบุชนิดข้อมูลและส่วนหัว) ได้รับการสนับสนุนแล้ว
- ขณะนี้ได้รับการสนับสนุนการเลือกทั่วไปของ ISO C11 (_Generic keyword)
- มีการสนับสนุนการจัดเก็บข้อมูลแบบเธรด (local) ของ ISO C11 (_Thread_local ซึ่งคล้ายกับ GNU C __thread)
- การสนับสนุนของ ISO C11 อยู่ในระดับที่ใกล้เคียงกับการสนับสนุนของ ISO C99: มีข้อบกพร่องแบบ modulo ที่สมบูรณ์มากขึ้น, ตัวระบุเพิ่มเติม (สนับสนุนยกเว้นกรณีมุมเมื่อมีการใช้ตัวระบุแบบยืดเวลา) ปัญหา floating-point (ส่วนใหญ่ แต่ไม่ครบถ้วน เกี่ยวกับคุณสมบัติเสริม C99 จากภาคผนวก F และ G) และภาคผนวก K (ขอบเขตการตรวจสอบอินเตอร์เฟซ) และ L (Analyzability)
- ส่วนขยาย C ใหม่ __auto_type มีชุดย่อยของฟังก์ชันการทำงานของ C ++ 11 อัตโนมัติใน GNU C
- C ++:
- การใช้งาน C ++ 1y สำหรับการทำงานปกติของ G ++ ได้รับการปรับปรุงเพื่อให้เป็นไปตาม N3638 ข้อเสนอที่ยอมรับในเอกสารการทำงาน สิ่งที่น่าสังเกตมากที่สุดคือจะเพิ่ม decltype (auto) สำหรับการรับความหมาย decltype แทนที่จะเป็นเทมเพลตการหักลบความหมายของ auto auto:
- int & amp; f ();
- อัตโนมัติ i1 = f (); // int
- decltype (อัตโนมัติ) i2 = f (); // int & amp;
- G ++ สนับสนุน C ++ 1y การจับภาพ lambda initializer:
- [x = 42] {... };
- จริงๆแล้วพวกเขาได้รับการตอบรับตั้งแต่ GCC 4.5 แต่ตอนนี้คอมไพเลอร์ไม่ได้เตือนเกี่ยวกับพวกเขาด้วย -std = c ++ 1y และสนับสนุน initializers แบบวงเล็บและแบบวงเล็บรวมทั้ง
- G ++ รองรับอาร์เรย์ความยาวหลากหลายแบบของ C ++ 1y G ++ ได้สนับสนุน VLA GNU / C99 เป็นเวลานาน แต่ขณะนี้ยังสนับสนุน initializers และ lambda capture โดยการอ้างอิง ในโหมด c ++ 1y G ++ จะบ่นเกี่ยวกับการใช้ VLA ที่ไม่ได้รับอนุญาตตามมาตรฐานร่างเช่นการสร้างตัวชี้ไปยังประเภท VLA หรือใช้ sizeof กับตัวแปร VLA โปรดสังเกตว่าขณะนี้ VLA จะไม่เป็นส่วนหนึ่งของ C ++ 14 แต่จะเป็นส่วนหนึ่งของเอกสารแยกต่างหากและบางทีอาจเป็น C ++ 17
- เป็นโมฆะ f (int n) {
- int a [n] = {1, 2, 3}; // throws std :: bad_array_length ถ้า n & lt; 3
- [& amp; a] {for (int i: a) {cout
1 ความคิดเห็น
http://www.eduwizzonlinetrainings.com 29 Dec 17
EduwizzOnlineTraining is one of the Best Online Training Institute in Hyderabad, Bangalore. Eduwizz provide courses like Hybris Development, WebSphere Commerce Server,Blockchain Training,Hyperledger Fabric Development ,Ethereum Development ,Commvault Training, Devops , Netapps , Mulesoft ESB ,Machine Learning,Data Science , Internet of Things , Hybris ,Angular JS , Node JS , Express JS , Business Analyst, Selenium testing with webdriver, Guidewire ,Adobe, RPA ,TSM, EMC...etc