gpt4 book ai didi

c++ - 在 C++ 中放置新的和对齐

转载 作者:IT老高 更新时间:2023-10-28 23:11:54 39 4
gpt4 key购买 nike

考虑以下代码片段在原地构造 POD(普通旧数据)结构的实例:

#include <new>
#include <cassert>
#include <cstddef>

struct Test
{
int a;
char b;
double c;
};

int main()
{
const std::size_t minimumNumberOfBytes = sizeof( Test ) * 4;

// Get a block of memory that can accommodate a Test instance and then some!
void* const ptrToMemBlock = new char[ minimumNumberOfBytes ];
assert( ptrToMemBlock );

// Construct a Test instance in-place.
const Test* const testInstance( ::new ( ptrToMemBlock ) Test() );

// Is this assumption guaranteed to be true?
assert( testInstance == ptrToMemBlock );
}

最终 assert() 所代表的假设是否保证始终正确?或者可以想象编译器可能决定构造 Test 实例,比如在我在placement-new 调用中指定的内存块开始之后的几个字节?

请注意,我在这里专门询问 POD 类型。我知道如果涉及到多重继承之类的东西,事情会变得很不稳定。

最佳答案

此断言将始终成立,因为需要 new 以返回具有最大可能对齐的内存块。顺便说一句 - 你的第一个 assert() 没有值(value),因为正常 new 不返回 nullptr - 它抛出或中止,只有“nothrow new"可以返回 nullptr

关于c++ - 在 C++ 中放置新的和对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614606/

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