我有一个指向函数的静态数组指针作为类的成员.
我需要对它进行初始化,但事实证明这个数组的长度是64K项,因此使用静态初始化器初始化它是不切实际的,就像{ x, y, z, ... }它会使代码混乱一样.
我反而用代码初始化它,有几个循环.
我想要这样做的方法是static在构造函数中初始化数组并为其设置一个标志,因此只有该类的第一个实例的构造才会触发此初始化.
从实例中访问这个静态标志也不是线程安全的,但这是另一个故事.
有更干净或更好的方法吗?
我也想要这个数组const,但我担心唯一的方法就是static {}初始化,对吗?
编译器是否具有生成所有全局变量的依赖关系树所需的所有信息,并为它们创建定义良好且正确的初始化顺序?我意识到你可以用全局变量写一个循环依赖 - 只做那种情况下未定义的行为 - 并且编译器可以警告并且可能有关它的错误.
通常这种情况的原因是它会给编译器制造商带来负担,或导致编译速度显着降低.我没有任何指标或证据表明在这种情况下这些都不是真的,但我倾向于两者都不是真的.
我一直在抓挠这个问题.我怀疑我;我只是在这里愚蠢,但我似乎无法获得const或静态成员进行初始化,所以我可以在整个课程中使用它.
这是一个展示我的问题的例子(或者更确切地说是我的误解):
using System;
namespace ConstExample
{
public class HasImmutableMember
{
// static private double fSectionLengthTolerancePerInch = 1 / (20 * 12); // tolerance is 1" per every 20'
private const double fSectionLengthTolerancePerInch = 1 / (20 * 12); // tolerance is 1" per every 20'
static HasImmutableMember()
{
Console.WriteLine("static c'tor: " + fSectionLengthTolerancePerInch);
}
public HasImmutableMember()
{
Console.WriteLine("instance c'tor: " + fSectionLengthTolerancePerInch);
}
}
public class Program
{
public void Main(string[] args)
{
HasImmutableMember instance = new HasImmutableMember();
} …Run Code Online (Sandbox Code Playgroud) 在C中,const不允许使用变量声明数组大小,即使它是变量.例如:这无法在C中编译:
#include <stdio.h>
const int SIZE = 2;
int a[SIZE];
int main()
{
a[0] = 1;
a[1] = 2;
printf("%i, %i", a[0], a[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
$gcc -o main *.c
main.c:5:5: error: variably modified ‘a’ at file scope
int a[SIZE];
^
Run Code Online (Sandbox Code Playgroud)
但是,在C++中,它运行得很好.
在C++中运行上面的代码.
输出:
$g++ -o main *.cpp
$main
1, 2
Run Code Online (Sandbox Code Playgroud)
要使其在C中运行,必须使用#define而不是变量.即:
这在C或C++中运行得很好:
#include <stdio.h>
#define SIZE 2
// const int SIZE = 2;
int a[SIZE];
int main()
{
a[0] = 1;
a[1] = …Run Code Online (Sandbox Code Playgroud) 我有以下程序:
#include <iostream>
void Init();
struct Foo {
Foo() {
int *p = new int; // just to make sure Foo's ctor is not a constant expression
Init();
}
} foo;
struct Bar {
constexpr Bar()
: value(0) { }
int value;
} bar;
void Init() {
bar.value = 1;
}
int main()
{
std::cout << bar.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这里foo的构造函数不是常量表达式,因此我们将动态初始化foo。但是bar的构造函数似乎是一个常量表达式,因此我们将对进行静态初始化bar。因此,bar必须先调用的ctor,然后foo将其1视为输出。我在GCC 8.3.0和Clang 8.0.0中观察到了这样的结果。但是对于Visual C ++,实际的输出是,0 …
c++ static-variables visual-c++ static-initialization constexpr