น่าสนุก c++ ขอแจม
template<class T>
char* HexDigit2BinStr(char* pBuf,int nBufSize,T hex)
{
int nChar(sizeof(hex));
nChar<<=3;
assert(nChar<nBufSize);
char* pc(&pBuf[nChar]);
*pc='\0';
--pc;
T tmp=hex;
for(int i=0;i<nChar;i++)
{
*pc=(tmp&1)?'1':'0';
tmp>>=1;
--pc;
}
return pBuf;
}
ขออภัยที่ไม่ได้ช่วยอะไร แต่ผมเห็นคำถามแล้วปิ๊งไอเดีย
ที่ผมสนใจก็คือ เอ เขียนอย่างไร ให้มันทำงานเร็วที่สุด
จากที่ลองหลายๆ แบบ แล้วดูโค้ด asm หลังจากที่คอมไพล์เลอร์มันคอมไพล์เป็น exe แล้ว
ปรากฏว่า หลายๆ จุดไม่ต่างกันเลย คอมไพล์เลอร์มันฉลาดพอ ที่จะแปลงโค้ดให้ออกมาดี
แม้ว่าเราจะเขียนโค้ดที่ไม่ใช่รูปแบบที่ คอมฯ เข้าใจที่สุด
ตรงนี้จึงเป็นข้อยืนยันอย่างนึง ที่ ระดับโปร เขาแนะนำให้เขียนโค้ด
โดยคิดว่าให้คนอ่าน ไม่ใช่ให้คอมฯ อ่าน เช่น
nChar<<=3;
หลายคนอาจสงสัย อะไรของมัน
โค้ดตรงนี้ผมต้องการหาจำนวนตัวอักษรที่ใช้แทนค่า 0 กะ 1 ของเลขฐานสอง
เนื่องจาก sizeof() คืนค่าขนาดของตัวแปร เป็น จำนวน ไบต์ และ 1 ไบต์ เท่ากัน 8 บิต หรือ 8 ตัวอักษรนั่นเอง
คนที่เริ่มเขียนโปรแกรม มักจะเขียนอย่างนี้
nChar=nChar*8;
พวกกระแดะ(เหมือนผม) จะเขียนแบบที่ยกมา
แบบทั่วไปที่คนเขียน และ ระดับโปรแนะนำ คือ
nChar*=8;
แล้วมันต่างกันอย่างไร
นั่นแหละครับที่ผมสงสัย(ที่จริงผมหายสังสัยนานละ เพราะอ่านหนังสือเจอ แต่ดูเหมือนจะยังไม่ได้พิสูจน์)
ผลที่ออกมาก็คือ ขึ้นอยู่กับประเภทของตัวแปรครับ
ถ้าเป็น ประเภท user defined type ควรเขียนแบบที่โปรแนะนำนั่นแหละครับ หรือจะเอาแบบกระแดะก็ได้
(user defined type ก็เช่น class ที่เราสร้างเอง)
แต่ถ้าเป็น ประเภทพื้นฐาน พวก char,short หรือ int ไม่ต่างกันครับ
คอมไพล์เลอร์ มันฉลาดพอที่จะแปลงโค้ดออกมาดี ซึ่งทั้งสามแบบ ผมลองแล้ว ก็ได้โค้ดออกมาเหมือนกันคือ
mov eax,dword ptr [nChar]
shl eax,3
mov dword ptr [nChar],eax
จะเห็นว่าแบบกระแดะ(ขออภัยที่ไม่สุภาพ) คือเขียนให้คอมฯ อ่าน และคอมไพล์เลอร์ก็คงชอบ ไม่ต้องคิดมาก
แต่อย่างที่บอก เขียนแบบให้คนอ่านหน่ะดีแล้ว ให้คอมไพล์เลอร์มันปวดหัวแทนเราดีกว่า(เหนื่อยทำไมเมื่อได้ผลเหมือนกัน)
แต่ก็มีบางกรณีนะครับ ที่คอมไพล์เลอร์ โง่กินเหมือนกัน
แทนที่จะแปลแบบนึง มันก็แปลอีกแบบนึง ตรงนี้แหละครับ ที่เขาวัดความสามารถของคอมไพล์เลอร์
เขาว่ากันว่า ของ borland ฉลาดกว่าของ ms
ผมก็พึ่งคิดได้ไม่กี่วันมานี่เอง
คืออยากเอา c++ builder มาลองเหมือนกัน แต่หาที่โหลด(ในไทย)ยังไม่เจอ
อ้อที่พูดมา มันเกี่ยวกับคุณสมบัติของ constructor กะ operator overloading ของ c++ นะครับ
ลักษณะเด่นอีกอย่างนึงของ c++ ก็คือ template ดังตัวอย่างโค้ดที่ยกมา
มันช่างทำอะไรๆ ให้ง่ายขึ้นตังเยอะ แถมมีประสิทธิภาพด้วย
(ตรงนี้เป็นโฆษณาชวนเชื่อ ให้มาสนใจ c++ โปรดใช้วิจารณญาณในการอ่าน

)
ขอบคุณที่ให้แจม ไปหละ ซะแว้บๆๆ แวบบบบบบ