ในบางกรณีเช่นที่อธิบายไว้มาตรฐาน C ++ อนุญาตให้คอมไพเลอร์ประมวลผลการสร้างไม่ว่าลูกค้าของพวกเขาจะพบว่ามีประโยชน์มากที่สุดโดยไม่จำเป็นต้องคาดเดาพฤติกรรมนั้น กล่าวอีกนัยหนึ่งการสร้างดังกล่าวเรียกว่า "พฤติกรรมที่ไม่ได้กำหนด" อย่างไรก็ตามนั่นไม่ได้หมายความว่าการสร้างดังกล่าวมีความหมายว่า "ต้องห้าม" เนื่องจาก C ++ Standard สละเขตอำนาจศาลอย่างชัดเจนในสิ่งที่โปรแกรมที่มีรูปแบบดี "อนุญาต" ให้ทำ ในขณะที่ฉันไม่รู้เอกสาร Rationale ใด ๆ ที่ตีพิมพ์สำหรับ C ++ Standard ความจริงที่ว่ามันอธิบายพฤติกรรมที่ไม่ได้กำหนดเหมือน C89 จะแนะนำความหมายที่ตั้งใจไว้คล้ายกัน: "พฤติกรรมที่ไม่ได้กำหนดให้สิทธิ์ใช้งานของผู้ใช้งาน เพื่อวินิจฉัย
มีหลายสถานการณ์ที่วิธีที่มีประสิทธิภาพที่สุดในการประมวลผลบางอย่างจะเกี่ยวข้องกับการเขียนส่วนต่าง ๆ ของโครงสร้างที่รหัสดาวน์สตรีมจะสนใจในขณะที่การละเว้นโค้ดที่ดาวน์สตรีมจะไม่สนใจ การขอให้โปรแกรมเริ่มต้นสมาชิกทุกคนของโครงสร้างรวมถึงสิ่งที่ไม่เคยสนใจก็จะขัดขวางประสิทธิภาพโดยไม่จำเป็น
นอกจากนี้ยังมีบางสถานการณ์ที่อาจมีประสิทธิภาพมากที่สุดในการมีข้อมูลที่ไม่ได้กำหนดค่าเริ่มต้นไว้ในรูปแบบที่ไม่ได้กำหนดไว้ล่วงหน้า ตัวอย่างเช่นกำหนด:
struct q { unsigned char dat[256]; } x,y;
void test(unsigned char *arr, int n)
{
q temp;
for (int i=0; i<n; i++)
temp.dat[arr[i]] = i;
x=temp;
y=temp;
}
หากรหัสดาวน์สตรีมจะไม่สนใจค่าขององค์ประกอบใด ๆ ของx.dat
หรือy.dat
ดัชนีที่ไม่อยู่ในรายการarr
รหัสอาจถูกปรับให้เหมาะสมกับ:
void test(unsigned char *arr, int n)
{
q temp;
for (int i=0; i<n; i++)
{
int it = arr[i];
x.dat[index] = i;
y.dat[index] = i;
}
}
การปรับปรุงประสิทธิภาพนี้เป็นไปไม่ได้หากโปรแกรมเมอร์จำเป็นต้องเขียนองค์ประกอบทุกอย่างของอย่างชัดเจนtemp.dat
รวมถึงสิ่งที่ล่องไม่สนใจก่อนทำการคัดลอก
ในทางกลับกันมีบางแอพพลิเคชั่นที่สำคัญที่จะต้องหลีกเลี่ยงการรั่วไหลของข้อมูล ในแอปพลิเคชันดังกล่าวอาจเป็นประโยชน์ที่จะมีรุ่นของรหัสที่ใช้เพื่อดักจับความพยายามในการคัดลอกที่เก็บข้อมูลที่ไม่กำหนดค่าเริ่มต้นโดยไม่คำนึงว่ารหัสปลายน้ำจะมองที่มันหรืออาจมีประโยชน์ในการรับประกันการใช้งาน เนื้อหาที่รั่วไหลออกมาจะถูกทำให้เป็นศูนย์หรือเขียนทับด้วยข้อมูลที่ไม่เป็นความลับ
จากสิ่งที่ฉันสามารถบอกได้ว่ามาตรฐาน C ++ นั้นไม่ได้พยายามที่จะบอกว่าพฤติกรรมใด ๆ เหล่านี้มีประโยชน์มากกว่าอย่างอื่นพอสมควร กระแทกแดกดันการขาดข้อกำหนดนี้อาจมีวัตถุประสงค์เพื่ออำนวยความสะดวกการเพิ่มประสิทธิภาพ แต่ถ้าโปรแกรมเมอร์ไม่สามารถใช้ประโยชน์จากการรับประกันพฤติกรรมที่อ่อนแอใด ๆ การเพิ่มประสิทธิภาพใด ๆ จะถูกปฏิเสธ