ฉันใช้คำคุณศัพท์ "เทคนิค" เพื่อหมายถึงพฤติกรรมภาษา / นิสัยใจคอและผลข้างเคียงของคอมไพเลอร์เช่นประสิทธิภาพของโค้ดที่สร้างขึ้น
ด้วยเหตุนี้คำตอบคือ: ไม่ (*) (*) คือ "โปรดอ่านคู่มือโปรเซสเซอร์ของคุณ" หากคุณกำลังทำงานกับระบบ RISC หรือ FPGA ที่เป็นตัวพิมพ์เล็กคุณอาจจำเป็นต้องตรวจสอบว่ามีคำแนะนำใดที่สร้างขึ้นและราคาเท่าไหร่ แต่ถ้าคุณกำลังใช้สวยมากสถาปัตยกรรมสมัยใหม่ใด ๆ ธรรมดาแล้วไม่มีความแตกต่างอย่างมีนัยสำคัญระดับการประมวลผลค่าใช้จ่ายในระหว่างlt
, eq
, และne
gt
หากคุณกำลังใช้กรณีขอบคุณอาจจะพบว่า!=
ต้องสามการดำเนินงาน ( cmp
, not
, beq
) VS สอง ( cmp
, blt xtr myo
) อีกครั้ง RTM ในกรณีนั้น
ส่วนใหญ่เหตุผลคือการป้องกัน / การชุบแข็งโดยเฉพาะอย่างยิ่งเมื่อทำงานกับพอยน์เตอร์หรือลูปที่ซับซ้อน พิจารณา
// highly contrived example
size_t count_chars(char c, const char* str, size_t len) {
size_t count = 0;
bool quoted = false;
const char* p = str;
while (p != str + len) {
if (*p == '"') {
quote = !quote;
++p;
}
if (*(p++) == c && !quoted)
++count;
}
return count;
}
ตัวอย่างที่มีการประดิษฐ์น้อยจะเป็นที่ที่คุณใช้ค่าส่งคืนเพื่อดำเนินการเพิ่มขึ้นโดยยอมรับข้อมูลจากผู้ใช้:
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i != len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
i += step; // here for emphasis, it could go in the for(;;)
}
}
ลองทำสิ่งนี้และป้อนค่า 1, 2, 10, 999
คุณสามารถป้องกันสิ่งนี้:
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i != len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
if (step + i > len)
std::cout << "too much.\n";
else
i += step;
}
}
แต่สิ่งที่คุณอาจต้องการคือ
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i < len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
i += step;
}
}
นอกจากนี้ยังมีบางสิ่งบางอย่างที่มีอคติต่อการประชุม<
เนื่องจากการสั่งซื้อในคอนเทนเนอร์มาตรฐานมักจะอาศัยoperator<
เช่นการแฮ็กในคอนเทนเนอร์ STL หลายรายการจะกำหนดความเท่าเทียมกันโดยการพูด
if (lhs < rhs) // T.operator <
lessthan
else if (rhs < lhs) // T.operator < again
greaterthan
else
equal
ถ้าlhs
และrhs
เป็นคลาสที่ผู้ใช้กำหนดให้เขียนโค้ดนี้เป็น
if (lhs < rhs) // requires T.operator<
lessthan
else if (lhs > rhs) // requires T.operator>
greaterthan
else
equal
ตัวดำเนินการต้องจัดเตรียมฟังก์ชันการเปรียบเทียบสองฟังก์ชัน ดังนั้น<
ได้กลายเป็นผู้ประกอบการที่ชื่นชอบ
i++
เป็นi+=2
(เช่น) มันจะทำงานเป็นเวลานานมาก (หรืออาจตลอดไป) ตอนนี้เนื่องจากโดยทั่วไปคุณใช้<
สำหรับกรณีเหล่านั้นที่คุณเพิ่มตัววนซ้ำมากกว่า 1 คุณจึงอาจใช้<
สำหรับกรณีที่คุณเพิ่มขึ้นด้วย 1 (เพื่อความมั่นคง)