Là giá trị của con trỏ `this` không đổi trong suốt vòng đời của đối tượng?


19

Là giá trị của thiscon trỏ được đảm bảo là không đổi trong suốt vòng đời của một đối tượng cụ thể? Tôi không thể tưởng tượng một trường hợp nó sẽ thay đổi, nhưng không biết liệu tôi có thiếu thứ gì không.


4
Giá trị của thiscon trỏ luôn là giá trị của địa chỉ của đối tượng mà hàm được gọi trên đó. Vì vậy, câu hỏi tương đương với 'một đối tượng có thể thay đổi địa chỉ bộ nhớ theo thời gian sống không?'
Aconcagua

2
Đáng lưu ý: nếu một người nói về tuổi thọ không chính thức, một đối tượng được di chuyển qua std::movesẽ thay đổi thiscon trỏ. Chính thức chúng ta sẽ nói đó là hai đối tượng khác nhau, nhưng về mặt thông thường, người ta có thể nghĩ chúng là "giống nhau", có thể gây nhầm lẫn nếu một người không chú ý.
Cort Ammon

Câu trả lời:


27

Là giá trị của thiscon trỏ được đảm bảo là không đổi trong suốt vòng đời của một đối tượng cụ thể?

.

Như người dùng Aconcagua đặt nó: giá trị của thiscon trỏ luôn là giá trị địa chỉ của đối tượng mà hàm được gọi trên 1 . Vì vậy, câu hỏi tương đương với:

Một đối tượng có thể thay đổi địa chỉ bộ nhớ của nó theo thời gian cuộc sống?

Điều này là không thể, theo định nghĩa của lifetime2 . Tuổi thọ của một đối tượng bắt đầu khi hoặc sau khi lưu trữ của nó được lấy và kết thúc trước khi nó được phát hành.


1) [class.this]/1

Trong cơ thể của một tổ chức phi tĩnh ( [class.mfct]hàm thành viên), từ khóa thislà một prvalue có giá trị là một con trỏ đến đối tượng mà hàm được gọi.

2) [basic.life]/1 (nhấn mạnh của tôi)

Thời gian tồn tại của một đối tượng hoặc tham chiếu là thuộc tính thời gian chạy của đối tượng hoặc tham chiếu. Một biến được cho là có khởi tạo trống nếu nó được khởi tạo mặc định và, nếu đó là kiểu lớp hoặc mảng (có thể là đa chiều), kiểu lớp đó có hàm tạo mặc định tầm thường. Thời gian tồn tại của một loại đối tượng Tbắt đầu khi :

  • lưu trữ với sự liên kết và kích thước phù hợp cho loại Tđược lấy , và
  • việc khởi tạo của nó (nếu có) đã hoàn tất (bao gồm cả khởi tạo trống) ( [dcl.init]), ngoại trừ việc nếu đối tượng là thành viên công đoàn hoặc tiểu dự án, thời gian tồn tại của nó chỉ bắt đầu nếu thành viên công đoàn đó là thành viên khởi tạo trong union ( [dcl.init.aggr], [class.base.init]) hoặc như mô tả trong [class.union].

Thời gian tồn tại của một đối tượng okiểu Tkết thúc khi :

  • nếu Tlà một loại không phải là lớp, đối tượng bị phá hủy, hoặc
  • nếu Tlà một loại lớp, cuộc gọi hàm hủy bắt đầu hoặc
  • bộ nhớ mà đối tượng chiếm giữ được giải phóng hoặc được sử dụng lại bởi một đối tượng không được lồng trong o( [intro.object]).

Điều này có nghĩa là không thể (bất hợp pháp) đối với thời gian chạy đủ phức tạp để thực hiện nén bộ nhớ tự động cho chương trình C ++? Hay nó chỉ có nghĩa là nó sẽ cần phải hành xử "như thể", để cung cấp cùng một giá trị thismọi lúc, bất kể chuyển động trong đống?
Alexander - Phục hồi lại

2
@Alex rõ ràng quy tắc as-if chiếm ưu thế. Luôn luôn.
YSC

1
@ Alexander-ReinstateMonica vtable là một khái niệm tương tự làm giảm hiệu suất, nhưng nó được chấp nhận vì lợi ích vượt xa nhược điểm. Bộ xử lý hiện đại thực sự hiệu quả với sự gián tiếp.
Đánh dấu tiền chuộc

1
@MarkRansom " là một con trỏ được đảm bảo là địa chỉ của một đối tượng hoặc trình biên dịch có tự do thêm một mức độ không xác định không? " Theo định nghĩa , ptr là địa chỉ của một đối tượng, nhưng "địa chỉ" có thể là một khái niệm trừu tượng cấp cao . Nhưng sau đó, nếu bạn giới thiệu sự gián tiếp, bạn cần nguyên tử, bạn cần khóa, bạn cần một loạt các công việc bổ sung trên tất cả các truy cập của bất kỳ đối tượng nào, nếu có chủ đề. Đơn giản chỉ bằng vẻ bề ngoài và cảm nhận của nó, tôi có thể không thể thực hiện được (và tôi thậm chí còn không coi thực tế C / C ++ tăng gấp đôi như một ngôn ngữ cấp thấp).
tò mò

1
@cquilguy bạn làm cho điểm tốt, và tôi không còn tranh luận rằng sự thiếu quyết đoán sẽ là thực tế. Nó vẫn làm cho một thí nghiệm suy nghĩ tốt mặc dù.
Đánh dấu tiền chuộc

8

Một đối tượng có một vùng lưu trữ. thisđiểm ở đó.

[intro.object]/1

Một đối tượng chiếm một vùng lưu trữ trong thời kỳ xây dựng ( [class.cdtor]), trong suốt vòng đời của nó và trong thời kỳ hủy diệt ( [class.cdtor]).


-1

Giá trị của thisđược đảm bảo là không đổi nếu chương trình từng đọc nó, nếu sau đó một số bit của giá trị đọc không thể thu thập rác hoặc nếu sau đó một số bit của giá trị đọc thoát ra bên ngoài chương trình. Trong tất cả các trường hợp khác, nó hoạt động giống như một con mèo của Schrödinger, nghĩa là nó không đổi và biến đổi cùng một lúc.


Xin lỗi, không hiểu gì cả. Rác thu gom là gì và thoát ra ngoài chương trình ?
Daniel Langr

@DanielLangr Các bit của giá trị của định danhthis
atomsymbol

Điều này không trả lời câu hỏi của tôi. Rác thu thập một số bit là gì? Hoặc để thoát khỏi chúng bên ngoài chương trình?
Daniel Langr

@DanielLangr Thật khó để giải thích trong một đoạn văn bản nhỏ
atomsymbol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.