我知道它提高了可读性并使程序不易出错,但它提高了多少性能?
在旁注中,参考和const指针之间的主要区别是什么?我会假设它们以不同的方式存储在内存中,但是如何呢?
我知道在可能的情况下,在通过引用或指针传递参数时,应尽可能使用const关键字.如果我指定参数是常量,编译器可以做的任何优化吗?
可能有几种情况:
功能参数:
常量参考:
void foo(const SomeClass& obj)
Run Code Online (Sandbox Code Playgroud)
Constant SomeClass对象:
void foo(const SomeClass* pObj)
Run Code Online (Sandbox Code Playgroud)
并且指向SomeClass的常量指针:
void foo(SomeClass* const pObj)
Run Code Online (Sandbox Code Playgroud)
变量声明:
const int i = 1234
Run Code Online (Sandbox Code Playgroud)
函数声明:
const char* foo()
Run Code Online (Sandbox Code Playgroud)
每个提供什么样的编译器优化(如果有的话)?
我经常使用const未修改的局部变量,如下所示:
const float height = person.getHeight();
Run Code Online (Sandbox Code Playgroud)
我认为它可以使编译后的代码更快,允许编译器进行更多优化.或者我错了,编译器可以自己弄清楚局部变量永远不会被修改?
在编写一个带有传递给它的args的C++函数时,如果可以保证不改变对象,则应始终使用const,如果指针不会被更改,则应始终使用const指针.
这种做法何时建议?
你什么时候使用const引用,比仅通过指针传递它有什么好处?
那么void MyObject::Somefunc(const std::string& mystring) 如果一个字符串实际上已经是一个不可变对象,那么拥有一个const字符串会有什么意义呢?
我有一个指针int* p,并在循环中执行一些操作.我不修改内存,只是阅读.如果我添加const到指针(两种情况,const int* p和int* const p),它可以帮助编译器优化代码吗?
我知道其他优点const,比如安全或自我记录,我会问这个特例.重新提出问题:可以const给编译器任何有用的(用于优化)信息吗?
看看这段代码:
struct Data {
};
struct Init {
Data *m_data;
Init() : m_data(new Data) { }
~Init() {
delete m_data;
}
};
class Object {
private:
const int m_initType;
Data *m_data;
public:
Object(const Init &init) : m_initType(0), m_data(init.m_data) { }
Object(Init &&init) : m_initType(1), m_data(init.m_data) { init.m_data = nullptr; }
~Object() {
if (m_initType==1) {
delete m_data;
}
}
};
void somefunction(const Object &object); // it is intentionally not defined
void callInitA() {
Init x;
somefunction(x);
}
void callInitB() { …Run Code Online (Sandbox Code Playgroud) ///////////////////////////////////////
class A {
...
const double funA(void)
{...}
};
A a;
double x = a.funA();
// although the intention is to
// enforce the return value to be const and cannot be
// modified, it has little effect in the real world.
class A2 {
...
double funB(void)
{...}
};
///////////////////////////////////////
class A {
void setA(const double d)
{ // now you cannot change the value of d, so what?
// From my point of view, it is NOT …Run Code Online (Sandbox Code Playgroud) 处理(否则)包含C++ 11随机类的随机生成器调用的常量函数的正确方法是什么?您是否应该放弃函数的常量标志,还是将生成器和分布声明为类的可变元素?一个最小的例子(不编译)可能是:
#include <random>
class foo
{
std::mt19937 MyGenerator;
std::normal_distribution<precision_type> gauss;
double get_rnd() const {return gauss(MyGenerator);}
};
Run Code Online (Sandbox Code Playgroud) 可能重复:
C++中的常量和编译器优化
让神圣的战争开始:我听到了很多关于const在C++中的用处的不同观点.当然它在成员函数声明等中有用.但它作为变量(或更确切地说,常量)的修饰符有用吗?如果剩下的代码保持不变,它确实对优化器有帮助吗?
我想知道在调用函数时用户是否有任何优势
A)void func(int i);
或类似的功能
B)void func(const int i);
在func内部,参数i无论如何都将被复制到堆栈(或编译器在其优化中选择的位置),对于调用此函数的用户,A和B之间没有区别.
所以如果一个工具类似于:
A)
void func(int i)
{
i = another_func(i);
printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)
或者使用const
B)
void func(const int i)
{
int j = another_func(i);
printf("%d", j);
}
Run Code Online (Sandbox Code Playgroud)
我的问题 :
实施B有什么优势?编译器可以执行任何类型的优化?A和B只是一个简单的例子,这些问题对其他情况有效.
我理解在指针中使用const的优点(例如const void*data),因为我们告诉用户我们不会修改它的内容,但我不理解const的用法,除了警告函数的程序员他不应该修改它,但在我看来,在API头文件中使用const是没用的.
谢谢你的帮助.