gpt4 book ai didi

c++ - C/C++ : do built-in objects such as `int` `double` always stay in the exact place within memory in the duration of the program?

转载 作者:太空狗 更新时间:2023-10-29 23:52:23 24 4
gpt4 key购买 nike

在程序运行期间,动态定义的内置类型是否始终位于同一 block 内存中?

如果这是我应该了解的东西,我该如何着手检查它?

int j = 0;
double k = 2.2;
double* p = &k;

如果 C/C++ 程序是高度内存密集型的,系统架构或编译器是否会移动所有这些对象?

注意:我不是在谈论诸如 std::vectors<T> 之类的容器.这些显然可以在某些情况下重新分配,但这同样是动态的。


附带问题:以下场景显然会引起一些人的注意。举个例子,这个指针在程序运行期间会一直有效吗?

由于我的无知,这个问题已经过时了!

struct null_deleter
{
void operator() (void const *) const {};
};

int main()
{
// define object
double b=0;

// define shared pointer
std::shared_ptr<double> ptr_store;
ptr_store.reset(&b,null_deleter()); // this works and behaves how you would expect
}

最佳答案

在抽象机中,对象的地址在对象的生命周期内不会改变。

(这里的“对象”一词并不是指“面向对象”的任何东西;“对象”只是一个存储区域。)

这实际上意味着程序的行为必须好像对象的地址永远不会改变。编译器可以生成代码来玩它喜欢的任何游戏,包括四处移动对象或根本不将它们存储在任何地方,只要此类游戏不会以违反标准的方式影响可见行为。

例如,这个:

int n;
int *addr1 = &n;
int *addr2 = &n;
if (addr1 == addr2) {
std::cout << "Equal\n";
}

必须打印“等于”——但聪明的优化编译器可以合法地消除除输出语句之外的所有内容。

ISO C 标准在第 6.2.4 节中明确说明了这一点:

The lifetime of an object is the portion of program execution during which storage is guaranteed to be reserved for it. An object exists, has a constant address, and retains its last-stored value throughout its lifetime.

带有(非规范性)脚注:

The term "constant address" means that two pointers to the object constructed at possibly different times will compare equal. The address may be different during two different executions of the same program.

我在C++标准中没有找到类似的显式声明;要么是我遗漏了它,要么是作者认为它太明显了,不用费心去说明。

关于c++ - C/C++ : do built-in objects such as `int` `double` always stay in the exact place within memory in the duration of the program?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15914211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com