c++ - 堆分配的 const 对象与非 const 对象有何不同?

标签 c++ memory-management constants undefined-behavior const-correctness

在 C++ 中可以 allocate a const object on heap :

const Class* object = new const Class();
const_cast<Class*>( object )->NonConstMethod(); // UB

因此尝试写入对象将是 UB。

我不明白这样的对象与未声明为 const 的堆分配对象有何不同:

const Class* object = new Class();

我的意思是,当我在堆栈上分配一个对象时,它会进入特定于实现的自动存储,因此可能有一些特定于实现的方法允许分配 const 以某种特殊方式生成对象,当我写入对象时会产生 UB。

然而,每当我使用 new 时,编译器都需要发出 operator new() 函数调用,而该函数不可能做任何不同的事情——它只是在无论我的代码中是否有const,都是统一的方式。

const 堆分配对象与非const 对象有何不同?如果我尝试修改它,未定义的行为如何可能?

最佳答案

这是不同的,因为创建的对象具有不同的类型(const Class 而不仅仅是 Class),并且它是未定义的行为,因为标准是这样说的。

这是简短的版本。不必有理由。 (如果有的话,反之亦然。不一定是 UB 的原因。UB 是默认状态。只有当有原因时,某些东西才会明确定义)

至于它在实践中的含义,或者如果您将对象视为非常量是否真的会导致问题,硬件不太可能做任何不同的事情。 const 对象显然不会被写入某种只读内存(因为那是不可能的),并且一旦分配了对象,它所在的内存页可能不会被标记为只读。

但编译器可以假定该对象是常量。因此,如果保证对象不变,它可能会以合法的方式优化或转换代码,但如果对象在中途被修改,则会中断。

这实际上与对象在硬件中的存储方式无关。 Const 或没有 const 很少在硬件级别上产生影响。但它在类型系统中产生了差异,并且在编译器转换代码的方式上产生了差异。

如果您告诉编译器一个对象是常量,那么编译器就会相信您,并根据该对象是常量的假设生成代码。

关于c++ - 堆分配的 const 对象与非 const 对象有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8356061/

相关文章:

c++ - and, or, not vs &&, ||, !

将 unsigned char * (uint8_t *) 转换为 const char *

java - 实现在应用程序启动时而不是在编译时初始化的 "constants"类

父类不能在静态上下文中使用 PHP const/static 变量

C++11 名称在一个类的完整范围内重新评估?

c++ - CMake:修改共享库时的冗余链接

c++ - 如何在 OpenGL 中反转纹理颜色

ios - 方法泄漏中的对象

c++ - 如何减少默认的 C++ 内存消耗?

c - 序列堆栈: uninitialized value was created by a heap allocation