在Visual Studio 2015中编译以下代码(Win7,x64,调试配置)花费了非常非常长的时间(即超过10分钟)
double tfuuuuuuu(int Ind)
{
const double Arr[600 * 258] = {3.5453, 45.234234234, 234234.234,// extends to 258 values for each line
// 599 lines here.....
};
return Arr[Ind];
}
Run Code Online (Sandbox Code Playgroud)
但是当我添加static关键字时,编译花了半秒钟
double tfuuuuuuu(int Ind)
{
static const double Arr[600 * 258] = {3.5453, 45.234234234, 234234.234,// extends to 258 values for each line
// 599 lines here.....
};
return Arr[Ind];
}
Run Code Online (Sandbox Code Playgroud)
我知道这static意味着变量将在两次调用之间保持其值,但是如果数组const仍然存在,那么如果我添加它会产生什么区别static呢?为什么编译时间会发生如此大的变化?
编辑 :
实际代码可以在此处找到(编译是在Debug模式下进行的)
C中字符串文字的类型是什么?是char *或const char *否const char * const?
那么C++呢?
我想做这样的事情,但我不能得到合作的语法.
static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0];
Run Code Online (Sandbox Code Playgroud)
我想我可以定义宏,但它们很难看.
我对这个答案的评论让我思考了constness和sort的问题.我玩了一下,把我的问题减少到这个代码的事实:
#include <vector>
int main() {
std::vector <const int> v;
}
Run Code Online (Sandbox Code Playgroud)
不会编译 - 你不能创建const int的向量.显然,我应该知道这一点(而且我已经知道了),但我以前从未需要创造这样的东西.然而,它似乎对我来说是一个有用的构造,我想知道是否有任何解决这个问题的方法 - 我想将东西添加到向量(或其他),但是一旦添加它们就不应该被更改.
可能有一些令人尴尬的简单解决方案,但这是我以前从未考虑过的.我可能不应该提到排序(我可能会问另一个问题,看看这个问题的难度).我真正的基本用例是这样的:
vector <const int> v; // ok (i.e. I want it to be OK)
v.push_back( 42 ); // ok
int n = v[0]; // ok
v[0] = 1; // not allowed
Run Code Online (Sandbox Code Playgroud) PHP不允许
class Foo
{
private const my_private_const;
Run Code Online (Sandbox Code Playgroud)
但当然允许
const my_const;
Run Code Online (Sandbox Code Playgroud)
所以实际上常量是全局的,因为我可以my_const在任何地方使用Foo::my_const
有没有办法制作私有常量?
以下代码片段(正确)在C中发出警告,在C++中发出错误(分别使用gcc和g ++,使用版本3.4.5和4.2.1进行测试; MSVC似乎并不关心):
char **a;
const char** b = a;
Run Code Online (Sandbox Code Playgroud)
我能理解并接受这个.
这个问题的C++解决方案是将b更改为const char*const*,它不允许重新分配指针并阻止你绕过const-correctness(C++ FAQ).
char **a;
const char* const* b = a;
Run Code Online (Sandbox Code Playgroud)
但是,在纯C中,更正后的版本(使用const char*const*)仍会发出警告,我不明白为什么.有没有办法绕过这个而不使用演员?
澄清:
1)为什么这会在C中产生警告?它应该完全是const安全的,并且C++编译器似乎认识到它.
2)在说(并让编译器强制执行)我不会修改它指向的字符时,接受这个char**作为参数的正确方法是什么?例如,如果我想写一个函数:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
Run Code Online (Sandbox Code Playgroud)
我想在char**上调用它,参数的正确类型是什么?
编辑:感谢那些做出回应的人,特别是那些提出问题和/或跟进我的回复的人.
我已经接受了这样一个答案,即如果没有演员阵容,我想做的事情是无法完成的,无论是否应该这样做.
显然,可以声明一个函数返回const void:
const void foo()
{
}
Run Code Online (Sandbox Code Playgroud)
g ++似乎认为const很重要,因为下面的代码不能编译:
#include <type_traits>
static_assert(std::is_same<void(), const void()>::value, "const matters");
Run Code Online (Sandbox Code Playgroud)
那const void有什么实际意义吗?
我理解const正确性意味着什么,而我的问题不在于const正确性是什么.所以我不期待一个解释或C++ - FAQ链接.
我的问题是:
constC和constC++ 之间的语义差异是什么?和从各自的标准中得出差异的报价将是很好的.
我经常在C和C++之间切换,我想知道在这样做时应该记住的重点.
我似乎不记得这些的原因(特别感谢你能提供一个推理)但是从我的头脑中,我记得:
char const*C++中的,但在C中它可以是char*.我错过了什么?
在C++中,函数的签名部分取决于它是否为const.这意味着一个类可以有两个具有相同签名的成员函数,除了一个是const而另一个不是.如果你有这样的类,那么编译器将根据你调用它的对象来决定调用哪个函数:如果它是类的const实例,那么将调用函数的const版本; 如果对象不是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)
每个提供什么样的编译器优化(如果有的话)?