ipp = &ip1;
Позднее назначение изменило значение ipp
. Вот почему он все еще указывает на ip1
.
Что вы делаете с *ipp
, т. Е. С ip1
, не меняет того факта, что ipp
указывает на ip1
.
Что здесь происходит?
Поучительно посмотреть на код, испускаемый компилятором:
.version 6.2 .target sm_52 .address_size 64 // .globl _Z4addrPy .visible .entry _Z4addrPy( .param .u64 _Z4addrPy_param_0 ) { .local .align 8 .b8 __local_depot0[40]; .reg .b64 %SP; .reg .b64 %SPL; .reg .b32 %r<2>; .reg .b64 %rd<6>; mov.u64 %SPL, __local_depot0; cvta.local.u64 %SP, %SPL; ld.param.u64 %rd1, [_Z4addrPy_param_0]; cvta.to.global.u64 %rd2, %rd1; mov.u32 %r1, %tid.x; mul.wide.u32 %rd3, %r1, 8; add.s64 %rd4, %rd2, %rd3; add.u64 %rd5, %SP, 0; st.global.u64 [%rd4], %rd5; ret; }
d
хранится в локальная память. У этого есть область уровня потока. Насколько мне известно, документация не определяет, как адресация или адресные пространства работают для локальной памяти.Если бы кто-то предполагал, что каждый поток имеет свое личное адресное пространство для локальной памяти, было бы логично, что первый элемент локальной памяти каждого потока начинался с того же адреса в локальном адресе потока пространство . Возможно, перевод TLB на уникальный адрес в глобальном банке памяти. Опять же, все предположения.