สรุปโดยย่อ
(ซึ่งฉันจะใส่ที่ด้านบน):
(0) การคิดพอยน์เตอร์เป็นที่อยู่มักเป็นเครื่องมือการเรียนรู้ที่ดีและมักจะนำไปใช้งานจริงสำหรับพอยน์เตอร์กับชนิดข้อมูลธรรมดา
(1) แต่สำหรับพอยน์เตอร์คอมไพเลอร์ส่วนใหญ่สำหรับฟังก์ชั่นอาจไม่ใช่ที่อยู่ แต่ใหญ่กว่าที่อยู่ (โดยทั่วไปคือ 2x หรือมากกว่านั้น) หรือเป็นตัวชี้ไปยังโครงสร้างในหน่วยความจำมากกว่ามีที่อยู่ของฟังก์ชั่นและสิ่งต่าง ๆ เช่น สระว่ายน้ำคงที่
(2) ตัวชี้ไปยังข้อมูลสมาชิกและตัวชี้ไปยังวิธีการมักจะเป็นคนแปลกหน้า
(3) รหัส x86 รุ่นเก่าที่มีปัญหาตัวชี้ FAR และ NEAR
(4) ตัวอย่างมากมายโดยเฉพาะอย่างยิ่ง IBM AS / 400 ที่มี "พอยน์เตอร์ไขมัน" ที่ปลอดภัย
ฉันแน่ใจว่าคุณสามารถหาข้อมูลเพิ่มเติมได้
รายละเอียด:
UMMPPHHH !!!!! คำตอบจำนวนมากจนถึงขณะนี้คือคำตอบ "โปรแกรมเมอร์วีน" ทั่วไป - แต่ไม่ใช่คอมไพเลอร์ weenie หรือ weenie ฮาร์ดแวร์ เนื่องจากฉันแกล้งทำเป็น Weenie ฮาร์ดแวร์และมักจะทำงานกับ Weenies ของคอมไพเลอร์ให้ฉันโยนสองเซ็นต์ของฉัน:
ในหลาย ๆ อาจจะมากที่สุดคอมไพเลอร์ C ตัวชี้ไปยังข้อมูลจากประเภทนี้ในความเป็นจริงที่อยู่ของT
T
ละเอียด.
แต่แม้กระทั่งคอมไพเลอร์เหล่านี้หลายตัวชี้บางอย่างไม่ได้อยู่ sizeof(ThePointer)
คุณสามารถบอกนี้โดยดูที่
ตัวอย่างเช่นพอยน์เตอร์ของฟังก์ชันบางครั้งก็ใหญ่กว่าที่อยู่ธรรมดามาก หรือพวกเขาอาจเกี่ยวข้องกับระดับของการอ้อม บทความนี้ให้คำอธิบายเดียวซึ่งเกี่ยวข้องกับโปรเซสเซอร์ Intel Itanium แต่ฉันเคยเห็นคนอื่น ๆ โดยทั่วไปแล้วการเรียกฟังก์ชันคุณต้องรู้ไม่เพียง แต่ที่อยู่ของรหัสฟังก์ชั่น แต่ยังเป็นที่อยู่ของสระว่ายน้ำคงที่ของฟังก์ชัน - ขอบเขตของหน่วยความจำที่ค่าคงที่จะถูกโหลดด้วยคำสั่งโหลดเดียวมากกว่าคอมไพเลอร์ ค่าคงที่ 64 บิตจากคำสั่งโหลดทันทีและ Shift และคำสั่ง OR ดังนั้นแทนที่จะเป็นที่อยู่ 64 บิตเดียวคุณต้องมีที่อยู่ 2 64 บิต ABIs บางตัว (Application Binary Interfaces) ย้ายสิ่งนี้ไปเป็น 128 บิตในขณะที่คนอื่นใช้ระดับของการอ้อมด้วยตัวชี้ฟังก์ชั่นจริง ๆ แล้วเป็นที่อยู่ของตัวบ่งชี้ฟังก์ชั่นที่มี 2 ที่อยู่จริงเพียงแค่กล่าวถึง ไหนดีกว่ากัน ขึ้นอยู่กับมุมมองของคุณ: ประสิทธิภาพขนาดรหัส และปัญหาความเข้ากันได้บางครั้ง - บ่อยครั้งที่โค้ดสันนิษฐานว่าตัวชี้สามารถถูกส่งไปเป็นแบบยาวหรือยาว แต่อาจสันนิษฐานว่ายาวเป็น 64 บิต รหัสดังกล่าวอาจไม่เป็นไปตามมาตรฐาน แต่อย่างไรก็ตามลูกค้าอาจต้องการให้มันใช้งานได้
พวกเราหลายคนมีความทรงจำอันเจ็บปวดของสถาปัตยกรรมเซกเมนต์เก่าของ Intel x86 ที่มีตัวชี้ใกล้และตัวชี้ไกล โชคดีที่สิ่งเหล่านี้เกือบจะสูญพันธุ์ไปแล้วในตอนนี้ดังนั้นสรุปได้อย่างรวดเร็วเท่านั้น: ในโหมดจริง 16 บิต, ที่อยู่เชิงเส้นที่แท้จริงคือ
LinearAddress = SegmentRegister[SegNum].base << 4 + Offset
ในขณะที่อยู่ในโหมดป้องกันมันอาจจะเป็น
LinearAddress = SegmentRegister[SegNum].base + offset
ด้วยที่อยู่ผลลัพธ์จะถูกตรวจสอบกับขีด จำกัด ที่ตั้งไว้ในส่วน บางโปรแกรมใช้การประกาศตัวชี้ C / C ++ FAR และ NEAR ไม่ได้มาตรฐานจริงๆ แต่หลายโปรแกรมเพิ่งบอกว่า*T
--- แต่มีคอมไพเลอร์และสวิทช์ลิงค์เกอร์ตัวอย่างเช่นตัวชี้รหัสอาจอยู่ใกล้ตัวชี้เพียง 32 บิตชดเชยกับสิ่งที่อยู่ การลงทะเบียน CS (ส่วนของรหัส) ในขณะที่พอยน์เตอร์ข้อมูลอาจเป็นพอยน์เตอร์ FAR โดยระบุทั้งหมายเลขเซ็กเมนต์ 16 บิตและออฟเซ็ต 32 บิตสำหรับค่า 48 บิต ตอนนี้ปริมาณทั้งสองนี้เกี่ยวข้องกับที่อยู่อย่างแน่นอน แต่เนื่องจากขนาดไม่เท่ากันซึ่งเป็นที่อยู่ใด นอกจากนี้เซ็กเมนต์ยังมีสิทธิ์ใช้งาน - อ่านอย่างเดียวอ่านเขียนปฏิบัติได้ - นอกเหนือจากสิ่งที่เกี่ยวข้องกับที่อยู่จริง
อีกตัวอย่างที่น่าสนใจคือ IMHO คือ (หรืออาจจะเป็น) ตระกูล IBM AS / 400 คอมพิวเตอร์เครื่องนี้เป็นเครื่องแรกที่ใช้ระบบปฏิบัติการใน C ++ พอยน์เตอร์ของเครื่องนี้มีขนาดปกติ 2 เท่าเช่นงานนำเสนอนี้กล่าวว่าตัวชี้ 128 บิต แต่ที่อยู่จริงคือ 48-64 บิตและอีกครั้งข้อมูลพิเศษบางอย่างที่เรียกว่าความสามารถที่ให้สิทธิ์เช่นการอ่านเขียนและขีด จำกัด เพื่อป้องกันบัฟเฟอร์ล้น ใช่: คุณสามารถทำสิ่งนี้ร่วมกับ C / C ++ - และถ้าสิ่งนี้แพร่หลาย, PLA จีนและมาเฟียสลาฟจะไม่ถูกแฮ็คเข้าสู่ระบบคอมพิวเตอร์ของตะวันตกมากมาย แต่ในอดีตการเขียนโปรแกรม C / C ++ ส่วนใหญ่ได้ละเลยความปลอดภัยสำหรับประสิทธิภาพ สิ่งที่น่าสนใจที่สุดคือตระกูล AS400 อนุญาตให้ระบบปฏิบัติการสร้างพอยน์เตอร์ที่ปลอดภัยซึ่งอาจมอบให้กับรหัสที่ไม่ได้รับสิทธิพิเศษ แต่รหัสที่ไม่ได้รับสิทธินั้นไม่สามารถปลอมแปลงหรือแก้ไขได้ ความปลอดภัยอีกครั้งและในขณะที่เป็นไปตามมาตรฐานรหัส C / C ++ ที่ไม่เป็นไปตามมาตรฐานเลอะเทอะมากจะไม่ทำงานในระบบที่ปลอดภัยเช่นนี้ อีกครั้งมีมาตรฐานอย่างเป็นทางการ
ตอนนี้ฉันจะออกจากกล่องสบู่รักษาความปลอดภัยของฉันและพูดถึงวิธีอื่น ๆ ที่ตัวชี้ (ประเภทต่าง ๆ ) มักจะไม่ได้อยู่จริงๆ: ตัวชี้ไปยังสมาชิกข้อมูลตัวชี้ไปยังวิธีการทำงานของสมาชิกและรุ่นคงที่นั้นใหญ่กว่า ที่อยู่ธรรมดา ตามที่โพสต์นี้ พูดว่า:
มีหลายวิธีในการแก้ปัญหานี้ [ปัญหาที่เกี่ยวข้องกับความเฉื่อยชาแบบเดี่ยวและหลายครั้งและการสืบทอดเสมือน] นี่คือวิธีที่คอมไพเลอร์ Visual Studio ตัดสินใจจัดการ: ตัวชี้ไปยังฟังก์ชันสมาชิกของคลาสที่สืบทอดที่สืบทอดมานั้นเป็นโครงสร้างจริงๆ "และพวกเขากล่าวต่อไปว่า" การคัดเลือกตัวชี้ฟังก์ชันสามารถเปลี่ยนขนาดได้! "
ในขณะที่คุณสามารถเดาได้จากการรักษาความปลอดภัย (ใน) pontificating ของฉันฉันได้มีส่วนร่วมใน C / C ++ ฮาร์ดแวร์ / โครงการซอฟต์แวร์ที่ตัวชี้ได้รับการปฏิบัติเช่นความสามารถมากกว่าที่อยู่ดิบ
ฉันสามารถไปต่อได้ แต่ฉันหวังว่าคุณจะได้รับความคิด
สรุปโดยย่อ
(ซึ่งฉันจะใส่ที่ด้านบน):
(0) การคิดพอยน์เตอร์เป็นที่อยู่มักจะเป็นเครื่องมือการเรียนรู้ที่ดีและมักจะเป็นการใช้งานจริงสำหรับพอยน์เตอร์กับชนิดข้อมูลธรรมดา
(1) แต่สำหรับพอยน์เตอร์คอมไพเลอร์ส่วนใหญ่สำหรับฟังก์ชั่นอาจไม่ใช่ที่อยู่ แต่ใหญ่กว่าที่อยู่ (โดยทั่วไปคือ 2X หรือมากกว่านั้นเป็นสองเท่า) หรือเป็นตัวชี้ไปยังโครงสร้างในหน่วยความจำมากกว่าที่มีที่อยู่ของฟังก์ชันและสิ่งต่าง ๆ เช่น สระว่ายน้ำคงที่
(2) ตัวชี้ไปยังข้อมูลสมาชิกและตัวชี้ไปยังวิธีการมักจะเป็นคนแปลกหน้า
(3) รหัส x86 รุ่นเก่าที่มีปัญหาตัวชี้ FAR และ NEAR
(4) ตัวอย่างมากมายโดยเฉพาะอย่างยิ่ง IBM AS / 400 ที่มี "พอยน์เตอร์ไขมัน" ที่ปลอดภัย
ฉันแน่ใจว่าคุณสามารถหาข้อมูลเพิ่มเติมได้