根据C++标准,const如果对象const本身不是,那么抛弃指针并写入对象是可以的.这样:
const Type* object = new Type();
const_cast<Type*>( object )->Modify();
Run Code Online (Sandbox Code Playgroud)
没关系,但这个:
const Type object;
const_cast<Type*>( &object )->Modify();
Run Code Online (Sandbox Code Playgroud)
是UB.
原因在于,当对象本身是const允许编译器优化对它的访问时,例如,不执行重复读取,因为重复读取对于不改变的对象没有意义.
问题是编译器如何知道实际上是哪些对象const?例如,我有一个功能:
void function( const Type* object )
{
const_cast<Type*>( object )->Modify();
}
Run Code Online (Sandbox Code Playgroud)
并将其编译为静态库,编译器不知道它将被调用的对象.
现在调用代码可以这样做:
Type* object = new Type();
function( object );
Run Code Online (Sandbox Code Playgroud)
它会很好,或者它可以做到这一点:
const Type object;
function( &object );
Run Code Online (Sandbox Code Playgroud)
它将是未定义的行为.
编译器应该如何遵守这些要求?如果不使后者工作,它应该如何使前者工作?
我有一个非常严格和严格的内存限制的问题.我是CPP的极客,我想减少我的内存使用量.请给我一些提示.
我的一个朋友建议在我的结构中使用函数.例如,而不是使用:
struct node{
int f()
{}
}
Run Code Online (Sandbox Code Playgroud)
他建议我用:
int f(node x)
{}
Run Code Online (Sandbox Code Playgroud)
这真的有帮助吗?
注意:我的结构有很多副本.
这里有更多信息:
我正在编写某种段树来解决在线评判中的练习问题.我在结构中获得树节点.我的struct有以下变量:
int start;
int end;
bool flag;
node* left;
node* right;
Run Code Online (Sandbox Code Playgroud)
内存限制为16 MB,我使用的是16.38 MB.
我想优化一些C++代码.让我们举一个简化的例子:
int DoSomeStuff(const char* data)
{
while(data != NULL)
{
//compute something and use optimization as much as possible
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我知道*data其他地方没有改变.我的意思是它没有在任何其他线程中更改,但编译器无法知道.有没有办法告诉编译器指针上的数据在范围的整个生命周期内都没有改变?
更新:
int DoSomeStuff(const volatile char* data)
{
while(data != NULL)
{
//compiler should assume that the data are changed elsewhere
}
return result;
}
Run Code Online (Sandbox Code Playgroud) 根据维基百科,函数调用不要复制它们是参数references的const类型:
void f_slow(BigObject x);
void f_fast(const BigObject& x);
f_slow(y); // slow, copies y to parameter x
f_fast(y); // fast, gives direct read-only access to y
Run Code Online (Sandbox Code Playgroud)
为什么需要参考const?非const参考文献不会做同样的事情:
void f_should_be_fast(BigObject& x);
Run Code Online (Sandbox Code Playgroud) 据我所知,在类中创建常量函数对于读/写编译器优化很有用.
类中的常量函数意味着类成员在执行函数期间将保持不变.但是,你可以通过const转换隐式参数来绕过这个(ofc这是一个非常糟糕的做法).
我的问题如下:
以下代码可能导致哪些陷阱(特别是在与线程同步无关的性能方面)?
int myClass::getSomething() const
{
myClass* writableThis = const_cast<myClass*>(this);
writableThis->m_nMemberInt++;
...
return m_nSomeOtherUnchangedMember;
}
Run Code Online (Sandbox Code Playgroud)
另一个相关问题:
行为编译器/ platform/os是否具体?
我还非常感谢有人能够在编译/执行这样的代码时解释引擎盖下的魔法(我推测CPU正在基于函数是const的事实进行无序优化,并且在实际执行期间不尊重这一点应该有一些副作用).
编辑:
感谢您为我澄清这一点.经过进一步的研究,所有收到的答案都是正确的,但我只接受一个:).
关于仅用于语法核心的const限定符,我相信这个答案是正确和错误的,说明这个(imho)的正确方法是它主要用于语法核心(在非常有限的场景中它可以产生不同/更好的代码).参考文献:SO相关问题,相关文章