标签: const

C / C ++中的const数组和静态const数组有什么区别

在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 c++ arrays static const

61
推荐指数
2
解决办法
2846
查看次数

C和C++中字符串文字的类型是什么?

C中字符串文字的类型是什么?是char *const char *const char * const

那么C++呢?

c c++ string const

60
推荐指数
2
解决办法
2万
查看次数

如何定义UIColor的常量值?

我想做这样的事情,但我不能得到合作的语法.

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)

我想我可以定义宏,但它们很难看.

cocoa-touch const objective-c uicolor

60
推荐指数
6
解决办法
4万
查看次数

我可以在向量中使用const来允许添加元素,但不能对已添加的元素进行修改吗?

我对这个答案的评论让我思考了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)

c++ stl const

60
推荐指数
4
解决办法
4375
查看次数

PHP中的私有常量是否可行?

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

有没有办法制作私有常量?

php const private

60
推荐指数
4
解决办法
3万
查看次数

为什么我不能在C中将'char**'转换为'const char*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**上调用它,参数的正确类型是什么?

编辑:感谢那些做出回应的人,特别是那些提出问题和/或跟进我的回复的人.

我已经接受了这样一个答案,即如果没有演员阵容,我想做的事情是无法完成的,无论是否应该这样做.

c pointers const const-correctness

59
推荐指数
3
解决办法
2万
查看次数

const无效的意义何在?

显然,可以声明一个函数返回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有什么实际意义吗?

c c++ const function void

59
推荐指数
2
解决办法
2万
查看次数

C vs C++中的Const正确性

我理解const正确性意味着什么,而我的问题不在于const正确性是什么.所以我不期待一个解释或C++ - FAQ链接.

我的问题是:

  • constC和constC++ 之间的语义差异是什么?
  • 差异的原因是什么?

从各自的标准中得出差异的报价将是很好的.

我经常在C和C++之间切换,我想知道在这样做时应该记住的重点.

我似乎不记得这些的原因(特别感谢你能提供一个推理)但是从我的头脑中,我记得:

  • C++中的const变量默认具有内部链接,而在C中它们具有默认的外部链接;
  • const对象可以在C++中用作编译时值,但不能在C中用作编译时值;
  • 字符串文字的指针必须是char const*C++中的,但在C中它可以是char*.

我错过了什么?

c c++ const

59
推荐指数
3
解决办法
1万
查看次数

在C++中使用const重载有什么用?

在C++中,函数的签名部分取决于它是否为const.这意味着一个类可以有两个具有相同签名的成员函数,除了一个是const而另一个不是.如果你有这样的类,那么编译器将根据你调用它的对象来决定调用哪个函数:如果它是类的const实例,那么将调用函数的const版本; 如果对象不是const,则将调用另一个版本.

您希望在什么情况下利用此功能?

c++ overloading const function

58
推荐指数
4
解决办法
2万
查看次数

const在C/C++中提供了哪些优化?(如果有的话)

我知道在可能的情况下,在通过引用或指针传递参数时,应尽可能使用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)

每个提供什么样的编译器优化(如果有的话)?

c c++ const compiler-optimization

58
推荐指数
4
解决办法
2万
查看次数