C++ const
本帖最后由 我就是个弟弟 于 2019-6-16 15:35 编辑#include <iostream>
using namespace std;
int main(int, char **)
{
const int number = 1234;
//如何修改number的值,可以用指针
return 0;
}
考考大家,看看大家对于C++和const的理解。 const int number = 1234;
int* a = (int *)&number;
*a = 666;
printf("%d\n", number);
newu 发表于 2019-6-16 15:35
非常接近答案了,大佬 我就是个弟弟 发表于 2019-6-16 15:52
非常接近答案了,大佬
难道不对? newu 发表于 2019-6-16 15:56
难道不对?
编译会优化滴 是要考const_cast吗?^_^
*const_cast<int *>(&number) = 100;
从反汇编来看,这样的确可以修改number变量
std::cout << number << std::endl;
如果只是这样输出number,从反汇编来看,编译器并没有访问number变量,编译器直接把number替换成了常量1234
所以输出时还要再来一次const_cast
#include <iostream>
int main(void)
{
const int number = 1234;
*const_cast<int *>(&number) = 100;
std::cout << *const_cast<int *>(&number) << std::endl;
return 0;
}
这样编译器就只能老老实实的传递number的地址
number变量的值已经由const_cast修改为100
#include <iostream>
void print(const int *number)
{
std::cout << *number << std::endl;
}
int main(void)
{
const int number = 1234;
*const_cast<int *>(&number) = 100;
print(&number);
return 0;
}
人造人 发表于 2019-6-16 16:24
这样编译器就只能老老实实的传递number的地址
number变量的值已经由const_cast修改为100
厉害!
所以说如果直接是输出number这个标识符的话还是逃不过c++的编译器是吗 newu 发表于 2019-6-16 16:31
厉害!
所以说如果直接是输出number这个标识符的话还是逃不过c++的编译器是吗
嗯,编译器会进行优化
#include <iostream>
int main(void)
{
const int number = 1234;
*const_cast<int *>(&number) = 100;
std::cout << number << std::endl;
return 0;
}
main:
.LFB1494:
.file 1 "main.cpp"
.loc 1 4 0
.cfi_startproc
pushq %rbp
.seh_pushreg %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.seh_setframe %rbp, 0
.cfi_def_cfa_register 6
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
.loc 1 4 0
call __main
.LVL0:
.loc 1 5 0
movl $1234, -4(%rbp) # 这里number初始化成1234
.loc 1 6 0
leaq -4(%rbp), %rax
movl $100, (%rax) # 这里把number修改成100
.loc 1 7 0
movl $1234, %edx # 这里直接把1234传给std::cout,并没有访问number变量
movq .refptr._ZSt4cout(%rip), %rcx
call _ZNSolsEi
movq .refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(%rip), %rdx
movq %rax, %rcx
call _ZNSolsEPFRSoS_E
.loc 1 8 0
movl $0, %eax
.loc 1 9 0
addq $48, %rsp
popq %rbp
.cfi_restore 6
.cfi_def_cfa 7, 8
ret
newu 发表于 2019-6-16 16:31
厉害!
所以说如果直接是输出number这个标识符的话还是逃不过c++的编译器是吗
#include <iostream>
int main(void)
{
const int number = 1234;
*const_cast<int *>(&number) = 100;
std::cout << *const_cast<int *>(&number) << std::endl;
return 0;
}
main:
.LFB1494:
.file 1 "main.cpp"
.loc 1 4 0
.cfi_startproc
pushq %rbp
.seh_pushreg %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.seh_setframe %rbp, 0
.cfi_def_cfa_register 6
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
.loc 1 4 0
call __main
.LVL0:
.loc 1 5 0
movl $1234, -4(%rbp)
.loc 1 6 0
leaq -4(%rbp), %rax
movl $100, (%rax)
.loc 1 7 0
leaq -4(%rbp), %rax # 这里访问number变量
movl (%rax), %eax
movl %eax, %edx
movq .refptr._ZSt4cout(%rip), %rcx
call _ZNSolsEi
movq .refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(%rip), %rdx
movq %rax, %rcx
call _ZNSolsEPFRSoS_E
.loc 1 8 0
movl $0, %eax
.loc 1 9 0
addq $48, %rsp
popq %rbp
.cfi_restore 6
.cfi_def_cfa 7, 8
ret
页:
[1]