ค่าของตัวชี้ `นี่ 'คงที่ในช่วงชีวิตของวัตถุหรือไม่?


19

ค่าของthisตัวชี้รับประกันเป็นค่าคงที่ในช่วงชีวิตของวัตถุเฉพาะหรือไม่? ฉันไม่สามารถจินตนาการถึงกรณีที่มันจะเปลี่ยน แต่ไม่ทราบว่าฉันไม่ได้หายไปบางสิ่งบางอย่าง


4
ค่าของthisตัวชี้เสมอคือค่าของที่อยู่ของวัตถุที่เรียกใช้ฟังก์ชัน ดังนั้นคำถามจึงเทียบเท่ากับ'วัตถุสามารถเปลี่ยนที่อยู่หน่วยความจำตลอดช่วงเวลาชีวิตได้หรือไม่'
Aconcagua

2
น่าสังเกต: ถ้าใครพูดถึงอายุขัยอย่างไม่เป็นทางการวัตถุที่เคลื่อนผ่านstd::moveจะเปลี่ยนพthisอยน์เตอร์ อย่างเป็นทางการเราจะบอกว่าสิ่งเหล่านั้นเป็นวัตถุสองอย่างที่แตกต่างกัน แต่อย่างไม่เป็นทางการอาจคิดว่าพวกเขาเป็น "เหมือนกัน" ซึ่งอาจก่อให้เกิดความสับสนหากใครไม่สนใจ
Cort Ammon

คำตอบ:


27

ค่าของthisตัวชี้รับประกันเป็นค่าคงที่ในช่วงชีวิตของวัตถุเฉพาะหรือไม่?

ใช่แล้ว

ในฐานะผู้ใช้Aconcaguaทำให้มัน: ค่าของthisตัวชี้เสมอคือค่าของที่อยู่ของวัตถุที่ฟังก์ชั่นที่เรียกว่าใน1 ดังนั้นคำถามจะเทียบเท่ากับ:

วัตถุสามารถเปลี่ยนที่อยู่หน่วยความจำในช่วงชีวิตได้หรือไม่?

นี้เป็นไปไม่ได้โดยความหมายของ2lifetime อายุการใช้งานของวัตถุเริ่มต้นเมื่อหรือหลังจากที่ได้รับการจัดเก็บและสิ้นสุดลงก่อนเมื่อมันถูกปล่อยออกมา


1) [class.this]/1

ในเนื้อความของ[class.mfct]ฟังก์ชันสมาชิกnon-static ( ) คำสำคัญthisคือprvalueซึ่งค่าเป็นตัวชี้ไปยังวัตถุที่เรียกใช้ฟังก์ชัน

2) [basic.life]/1 (เน้นที่เหมือง)

อายุการใช้งานของวัตถุหรือการอ้างอิงเป็นคุณสมบัติรันไทม์ของวัตถุหรือการอ้างอิง ตัวแปรถูกกล่าวว่ามีการเริ่มต้นที่ว่างถ้ามันเป็นค่าเริ่มต้นและถ้ามันเป็นประเภทคลาสหรืออาร์เรย์ (อาจเป็นหลายมิติ) ของมันประเภทคลาสนั้นมีคอนสตรัคเตอร์แบบปริยาย อายุการใช้งานของออบเจ็กต์ประเภทTเริ่มต้นเมื่อ :

  • การจัดเก็บด้วยการจัดตำแหน่งและขนาดที่เหมาะสมสำหรับประเภทTได้รับและ
  • การเริ่มต้นของมัน (ถ้ามี) จะเสร็จสมบูรณ์ (รวมถึงการเริ่มต้นว่าง) ( [dcl.init]) ยกเว้นว่าถ้าวัตถุเป็นสมาชิกสหภาพหรือ subobject ดังกล่าวอายุการใช้งานของมันจะเริ่มต้นถ้าสมาชิกสหภาพนั้นเป็นสมาชิกเริ่มต้นในสหภาพ ( [dcl.init.aggr], [class.base.init]) หรือ [class.union]อธิบายไว้ใน

อายุการใช้งานของวัตถุoประเภทTสิ้นสุดลงเมื่อ :

  • ถ้าTเป็นชนิดที่ไม่ใช่คลาสวัตถุถูกทำลายหรือ
  • ถ้าTเป็นประเภทคลาสการเรียก destructor จะเริ่มขึ้นหรือ
  • หน่วยเก็บข้อมูลที่วัตถุครอบครองถูกปล่อยหรือถูกนำมาใช้ซ้ำโดยวัตถุที่ไม่ซ้อนอยู่ภายในo( [intro.object])

สิ่งนี้หมายความว่าจะเป็นไปไม่ได้ (ผิดกฎหมาย) สำหรับรันไทม์ที่ซับซ้อนเพียงพอที่จะใช้การบีบอัดหน่วยความจำอัตโนมัติสำหรับโปรแกรม C ++ ใช่หรือไม่ หรือหมายความว่าจะต้องประพฤติ "as-if" เพื่อให้คุณค่าเดียวกันthisทุกครั้งโดยไม่คำนึงถึงการเคลื่อนไหวในกอง
Alexander - Reinstate Monica

2
@Alex เห็นได้ชัดว่ากฎราวกับถ้าเหนือกว่า เสมอ.
YSC

1
@ Alexander-ReinstateMonica vtable เป็นแนวคิดที่คล้ายกันที่ช่วยลดประสิทธิภาพ แต่ได้รับการยอมรับเนื่องจากผลประโยชน์มีมากกว่าข้อเสีย หน่วยประมวลผลที่ทันสมัยมีประสิทธิภาพจริง ๆ โดยทางอ้อม
Mark Ransom

1
@ MarkRansom " เป็นตัวชี้ที่รับประกันได้ว่าเป็นที่อยู่ของวัตถุหรือคอมไพเลอร์อิสระที่จะเพิ่มระดับของการเปลี่ยนทิศทางหรือไม่ " โดยนิยามว่า ptr เป็นที่อยู่ของวัตถุ แต่ "ที่อยู่" อาจเป็นแนวคิดนามธรรมระดับสูง . แต่ถ้าคุณแนะนำทางอ้อมคุณต้องมีอะตอมมิกซิตี้คุณต้องล็อคคุณต้องทำงานเพิ่มเติมมากมายในการเข้าถึงวัตถุใด ๆ หากมีเธรด เพียงแค่รูปลักษณ์และความรู้สึกของมันฉันสามารถมันใช้ไม่ได้ (และฉันไม่ได้คิดว่า C / C ++ เป็นภาษาระดับต่ำสองเท่า)
curiousguy

1
@coolguy คุณทำคะแนนที่ดีและฉันไม่เถียงว่าทางอ้อมจะเป็นประโยชน์ มันยังคงเป็นการทดลองทางความคิดที่ดี
Mark Ransom

8

วัตถุมีพื้นที่จัดเก็บ thisจุดที่นั่น

[intro.object]/1

วัตถุครอบครองพื้นที่เก็บข้อมูลในช่วงเวลาของการก่อสร้าง ( [class.cdtor]) ตลอดอายุการใช้งานและในช่วงเวลาที่ถูกทำลาย ( [class.cdtor])


-1

ค่าของthisการรับประกันว่าจะคงที่หากโปรแกรมที่เคยอ่านมันถ้าต่อมาบางส่วนของค่าการอ่านเป็นไปไม่ได้ที่จะรวบรวมขยะหรือถ้าต่อมาบางส่วนของค่าการอ่านหนีออกนอกโปรแกรม ในกรณีอื่น ๆ ทั้งหมดมันทำตัวเหมือนแมวของSchrödingerนั่นคือมันเป็นค่าคงที่และแปรผันในเวลาเดียวกัน


ขออภัยไม่เข้าใจเลย อะไรคือสิ่งที่ขยะเก็บรวบรวมและการที่จะหลบหนีออกไปข้างนอกของโปรแกรม ?
Daniel Langr

@DanielLangr บิตของค่าของตัวระบุthis
atomsymbol

นี่ไม่ตอบคำถามของฉัน ขยะคือการรวบรวมบิตบางอย่าง? หรือจะหลบหนีพวกเขานอกโปรแกรม?
Daniel Langr

@DanielLangr มันยากที่จะอธิบายในข้อความชิ้นเล็ก ๆ
atomsymbol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.