相关疑难解决方法(0)

static关键字及其在C++中的各种用途

关键字static是一个在C++中具有多种含义的关键字,我发现它非常令人困惑,我永远无法理解它实际上应该如何工作.

根据我的理解,static存储持续时间,这意味着它在全局的情况下持续程序的生命周期,但是当你谈论本地时,它意味着它默认为零初始化.

C++标准对具有关键字的类数据成员说明了这一点static:

3.7.1静态存储持续时间[basic.stc.static]

3关键字static可用于声明具有静态存储持续时间的局部变量.

4应用于类定义中的类数据成员的关键字static为数据成员提供静态存储持续时间.

局部变量是什么意思?这是一个函数局部变量吗?因为还有一个当你声明一个本地函数时static,它只被初始化一次,它第一次进入这个函数.

它也只谈到关于类成员的存储持续时间,它是非实例特定的,那也是staticno 的属性?或者是存储持续时间?

那么static和文件范围的情况如何呢?是否所有全局变量都被视为默认具有静态存储持续时间?以下(来自第3.7.1节)似乎表明:

1所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间.这些实体的存储应持续该计划的持续时间(3.6.2,3.6.3)

如何static与变量的链接相关?

整个static关键字是彻头彻尾的混乱,有人可以澄清英语的不同用途,并告诉我何时初始化一个static类成员?

c++ static

186
推荐指数
6
解决办法
16万
查看次数

在内存中我的变量存储在C中?

通过考虑将内存分为四个部分:数据,堆,堆栈和代码,全局变量,静态变量,常量数据类型,局部变量(在函数中定义和声明),变量(在main函数中),指针,并动态分配空间(使用malloc和calloc)存储在内存中?

我认为他们将分配如下:

  • 全局变量------->数据
  • 静态变量------->数据
  • 常量数据类型----->代码
  • 局部变量(在函数中声明和定义)--------> stack
  • 在main函数-----> heap中声明和定义的变量
  • 指针(例如char *arr,int *arr)------->堆
  • 动态分配空间(使用malloc和calloc)-------->堆栈

我只是从C的角度来指这些变量.

如果我错了,请纠正我,因为我是C的新手.

c memory types memory-management

134
推荐指数
5
解决办法
20万
查看次数

"const static"在C和C++中意味着什么?

const static int foo = 42;
Run Code Online (Sandbox Code Playgroud)

我在StackOverflow上的一些代码中看到了这个,我无法弄清楚它是做什么的.然后我在其他论坛上看到了一些困惑的答案.我最好的猜测是它在C中用来隐藏foo其他模块的常量.它是否正确?如果是这样,为什么有人会在C++上下文中使用它,你可以做到这一点private

c c++

111
推荐指数
7
解决办法
18万
查看次数

C++中的静态数组与动态数组

C++中的静态数组和动态数组有什么区别?

我必须为我的班做一个任务,它说不要使用静态数组,只使用动态数组.我看过这本书和网上,但我似乎并不理解.

我认为静态是在编译时创建的,并且在运行时是动态的,但我可能会误以为内存分配.

你能解释一下C++中静态数组和动态数组之间的区别吗?

c++ arrays static allocation dynamic

79
推荐指数
5
解决办法
20万
查看次数

声明int数组

这两个声明之间有什么区别吗?

int x[10];
Run Code Online (Sandbox Code Playgroud)

int* x = new int[10];
Run Code Online (Sandbox Code Playgroud)

我认为前一个声明(如后一个声明)是一个指针声明,两个变量都可以相同.这是否意味着它们本质上是一样的?

c++ arrays pointers initialization

63
推荐指数
4
解决办法
8万
查看次数

C++链接如何在实践中发挥作用?

C++链接如何在实践中发挥作用?我正在寻找的是关于链接如何发生的详细解释,而不是链接的命令.

关于编译已经有类似的问题,但没有详细说明:编译/链接过程如何工作?

c++ linker

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

静态局部变量在哪里

静态局部变量存储在内存中的哪个位置?只能在声明它们的函数内访问局部变量.

全局静态变量进入.data段.

如果静态全局变量和静态局部变量的名称相同,编译器如何区分它们?

c static

11
推荐指数
1
解决办法
2781
查看次数

最大化Java堆空间

我试图在Java中使用非常大的方形矩阵,大约n = 1e6或更多.矩阵不是稀疏的,所以我没有看到很多方法将它们表示为2D数组,这需要n ^ 2*sizeof(int)位的内存.显然,即使添加编译器标志以用作我的机器允许的大堆,我也会遇到堆溢出错误.

我愿意为了这个问题而假设我拥有完美的计算机(无限制的RAM等),尽管实际上我在64位机器上有16 GB的RAM.似乎我的机器只是如此相关,因为我受JVM的限制而不是我的实际硬件(因为JVM不能拥有比我的物理机更多的内存).

我理解(并且引用,例如,在这里制作一个非常大的Java数组),Java阵列甚至在理论上也不能比用于索引的MAX_INT大.

我的问题是:有没有办法从JVM堆中哄骗额外的内存

据我所知,如果有,他们可能不会给我更多信息.

例如

在C中,我可以声明静态常量变量,并将它们移动到代码的数据部分,这将比堆有更多的空间,远远超过堆栈(存储的静态变量在哪里(在C/C++中)?) .

在Java中,似乎即使我将变量复制到"数据"部分,该值也会进入java中的主堆 静态分配 - 堆,堆栈和永久生成,这意味着我已成功移动一个完整的字节堆(耶!)

我的解决方案

我的"解决方案"并不是真正的解决方案.我创建了一个简单的数据结构,它使用RandomFileAccess io过程来替换对外部文件的读写的数组访问.它仍然是恒定时间访问,但我们从Java最快的操作之一转到非常非常慢的过程(尽管我们可以同时从文件中提取"缓存"行,这使得该过程非常快速).好主意?

不是我的问题

我不是问如何在java的最大数组大小之上创建一个数组.这是不可能的.这些是嵌套数组 - 单个n大小的数组很好,其中n个引起问题.

我不是问这个如何处理"java.lang.OutOfMemoryError:Java堆空间"错误(64MB堆大小).垃圾收集是不相关的 - 我甚至无法让阵列更加担心何时被删除.

我也不能使用迭代器(我认为),否则这将是一种可能性; 像矩阵乘法这样的函数需要能够直接索引

注意:Java不是在非常大的矩阵上进行操作的正确语言.我最好使用算盘.但我在这里,这是我无法控制的.

java memory-management

10
推荐指数
1
解决办法
570
查看次数

为什么在main中声明一个静态变量?

阅读其他人的代码,我看到了与语法类似的东西:

int main(void) {
    static int attr[] = {FOO, BAR, BAZ, 0};
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是有一些理由声明变量main static?据我了解,它static可以防止链接并保持调用之间的价值.因为它在函数内部只执行后者,但main只调用一次,所以我没有看到这一点.这是否会修改某些编译行为(例如,防止其优化不存在)?

c static program-entry-point

10
推荐指数
2
解决办法
2223
查看次数

CUDA:为什么不能定义静态全局成员函数?

当使用nvcc(CUDA 5.0)编译下面的代码时,出现错误"内存限定符的非法组合",因为显然不可能在类中具有全局内核.

class A
{
public:
    __global__ static void kernel();
};

__global__ void A::kernel()
{}
Run Code Online (Sandbox Code Playgroud)

在处理非静态成员时我可以理解这个限制,但是为什么在内核声明为静态时仍然会出现错误?调用此类成员与在函数体中声明函数时调用该函数没有什么不同(A在本例中).

A::kernel <<< 1, 1 >>> ();
Run Code Online (Sandbox Code Playgroud)

有没有理由我错过了为什么还没有实现呢?

编辑:根据答案和评论中的回答,我对我的问题不够清楚.我的问题不是出现错误的原因.显然,这是因为它尚未实施.我的问题是为什么它没有得到实施.到目前为止,我还没有想到让这个功能得以实现的原因.我意识到我可能已经忘记了一个会使问题复杂化的特殊情况,因此也就是问题.

我认为这是一个合理的功能的原因是:

  • 静态函数没有this指针所以即使在主机上的对象上调用内核,访问其数据也没有冲突,因为这些数据首先是不可访问的(来自哪个对象的数据? ).
  • 您可能会争辩说,如果类具有与之关联的静态数据,并且存在于主机上,那么原则上应该可以从静态内核访问它.但是,也不支持静态数据,因此不会发生冲突.
  • 在主机上的对象上调用静态内核(A a; a.staticKernel<<<...,...>>>();)完全等同于在没有对象的情况下调用它(A::staticKernel<<<...,...>>>();),正如我们在常规C++中习惯的那样.

我错过了什么?

c++ static cuda global member

9
推荐指数
1
解决办法
4926
查看次数