c++ 是否可以保证对象的地址是相同的?

yxyvkwin  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(141)

我有一个基类,它有一个指针,我还有两个派生类,它们被实现为堆栈分配和动态分配的存储空间,我需要从这些类中设置基类上的指针,对于第一种情况,指向堆栈分配存储空间的地址,对于第二种情况,指向动态分配的空间。
我的问题是针对堆栈分配的情况。

struct base { int *ptr; };

template<std::size_t N>
struct stack_allocator: base {
    int arr[N];
};
struct dyn_allocator: base {
};

template<std::size_t N>
auto make_allocator(int (&arr)[N])
   -> stack_allocator<N> // because of C++11
{
    stack_allocator<N> res;
    res.ptr = res.arr;
    printf("addr inside: %p\n", res);
    return res;
}

// using

int stack[32];
auto alloc = make_allocator(stack);
printf("addr outside: %p\n", alloc);

// will print the same address

我确实知道make_allocator()可以只返回一个具有diff对象地址的副本,但至少在我的测试中和目前看来,地址是相同的。
为什么会发生这种情况?我怎么才能保证这种情况会继续发生?

nwlqm0z1

nwlqm0z11#

res的地址与alloc相同,可能是因为NRVO或其他优化。我不建议依赖这种行为。
一个简单的方法是将make_allocator作为stack_allocator的构造函数,或者向make_allocator添加一个引用/指针参数来代替返回值。

相关问题