在 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/