- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我很好奇在当前 C++ 标准下如何解释以下情况,尤其是在生命周期等方面。它是未定义的行为吗?
首先,让我们从以下定义开始:可重定位对象是一个在其实际内存位置上不变的对象——也就是说,无论指针 this 的值如何,它的状态都保持不变。假设我们有一个可重定位类型 Relocatable(其定义与示例无关)。
然后我们有以下代码(C++17):
typedef std::aligned_storage_t<sizeof(Relocatable)> Storage;
// construct an instance of a relocatable within a storage
auto storage0 = new Storage();
new(storage0) Relocatable(...);
{
// obj is a valid reference
// should use std::launder() here, but clang doesn't have it yet
Relocatable& obj = *reinterpret_cast<Relocatable*>(storage0);
}
// move the storage
auto storage1 = new Storage();
memcpy(storage1, storage0, sizeof(Storage));
delete storage0;
{
// ?????? what does the standard say about this?
Relocatable& obj = *reinterpret_cast<Relocatable*>(storage1);
}
这与预期的一样适用于 GCC 和 Clang(对象只是继续存在于新存储中)。但是,我不完全确定标准是否适用于此。从技术上讲,对象的生命周期尚未结束(未调用析构函数),并且在 memcpy() 调用后没有对位于旧位置的对象的任何访问。此外,不存在对旧位置的引用/指针。尽管如此,鉴于 C++ 似乎大多数时候都将对象标识和对象存储视为同一事物,因此禁止这样做可能是有原因的。预先感谢所有有见地的评论。
编辑:有人建议 Why would the behavior of std::memcpy be undefined for objects that are not TriviallyCopyable?是这个问题的拷贝。我不确定是不是。首先,我正在 memcpying 存储,而不是对象实例。二、std::is_trivially_copyable<Relocatable>::value
实际上评估为 true
对于所有实际相关的应用程序。
附言我问这个实际上有一个很好的实际原因。有时让对象只能存在于它们的容器中是有用的——它们不可复制也不可 move 。例如,我目前正在设计一个具有这样属性的优化树数据结构——树节点只能存在于树存储中,它们不能被移出或复制——对它们的所有操作都是通过短暂的引用来执行的。为了防止程序员错误(意外复制/move ),我删除了复制和 move 构造函数。这有一个相当不幸的结果,即节点不能存储在 std::vector 中。放置新的和明确管理的存储可以用来绕过这个限制——但我当然不想做一些不符合标准的事情。
最佳答案
因此,与所有这些类型的问题一样,对象仅在 four situations 中创建:
An object is created by a definition ([basic.def]), by a new-expression, when implicitly changing the active member of a union ([class.union]), or when a temporary object is created ([conv.rval], [class.temporary]).
这段代码:
auto storage1 = new Storage();
memcpy(storage1, storage0, sizeof(Storage));
在 storage1
处为您提供了一个类型为 Storage
的对象,但是此时没有创建类型为 Relocatable
的对象。因此,这:
Relocatable& obj = *reinterpret_cast<Relocatable*>(storage1);
是未定义的行为。期间。
为了为其定义行为,我们需要第五种机制来创建对象,例如 P0593 中提出的机制。 :
We propose that at minimum the following operations be specified as implicitly creating objects: [...]
A call to
memmove
behaves as if it
copies the source storage to a temporary area
implicitly creates objects in the destination storage, and then
copies the temporary storage to the destination storage.
This permits
memmove
to preserve the types of trivially-copyable objects, or to be used to reinterpret a byte representation of one object as that of another object.A call to
memcpy
behaves the same as a call tomemmove
except that it introduces an overlap restriction between the source and destination.
此提议(或类似提议)对您的代码格式良好是必要的。
关于c++ - C++ 标准对 move 实时对象存储有何看法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49297869/
我正在运行一个辅助角色,并检查 Azure 上托管的存储中是否存在数据。当我将连接字符串用于经典类型的存储时,我的代码可以正常工作,但是当我连接到 V2 Azure 存储时,它会抛出此异常。 “远程服
在我的应用程序的主页上,我正在进行 AJAX 调用以获取应用程序各个部分所需的大量数据。该调用如下所示: var url = "/Taxonomy/GetTaxonomyList/" $.getJSO
大家好,我正在尝试将我的商店导入我的 Vuex Route-Gard。 路由器/auth-guard.js import {store} from '../store' export default
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我的 Windows 计算机上的本地文件夹中有一些图像。我想将所有图像上传到同一容器中的同一 blob。 我知道如何使用 Azure Storage SDKs 上传单个文件BlockBlobServi
我尝试发出 GET 请求来获取我的 Azure Blob 存储帐户的帐户详细信息,但每次都显示身份验证失败。谁能判断形成的 header 或签名字符串是否正确或是否存在其他问题? 代码如下: cons
这是用于编写 JSON 的 NeutralinoJS 存储 API。是否可以更新 JSON 文件(推送数据),而不仅仅是用新的 JS 对象覆盖数据。怎么做到的??? // Javascript
我有一个并行阶段设置,想知道是否可以在嵌套阶段之前运行脚本,所以像这样: stage('E2E-PR-CYPRESS') { when { allOf {
我想从命令行而不是从GUI列出VirtualBox VM的详细信息。我对存储细节特别感兴趣。 当我在GUI中单击VM时,可以看到包括存储部分在内的详细信息: 但是到目前为止,我还没有找到通过命令行执行
我有大约 3500 个防洪设施,我想将它们表示为一个网络来确定流动路径(本质上是一个有向图)。我目前正在使用 SqlServer 和 CTE 来递归检查所有节点及其上游组件,只要上游路径没有 fork
谁能告诉我 jquery data() 在哪里存储数据以及何时删除以及如何删除? 如果我用它来存储ajax调用结果,会有性能问题吗? 例如: $("body").data("test", { myDa
有人可以建议如何为 Firebase 存储中的文件设置备份。我能够备份数据库,但不确定如何为 firebase 存储中的文件(我有图像)设置定期备份。 最佳答案 如何进行 Firebase 存储的本地
我最近开始使用 firebase 存储和 firebase 功能。现在我一直在开发从功能到存储的文件上传。 我已经让它工作了(上传完成并且文件出现在存储部分),但是,图像永远保持这样(永远在右侧加载)
我想只允许用户将文件上传到他们自己的存储桶中,最大文件大小为 1MB,仍然允许他们删除文件。我添加了以下内容: match /myusers/{userId}/{allPaths=**} { al
使用生命周期管理策略将容器的内容从冷访问层移动到存档。我正在尝试以下策略,希望它能在一天后将该容器中的所有文件移动到存档层,但事实并非如此在职的。我设置了选择标准“一天未使用后”。 这是 json 代
对于连接到 Azure 存储端点,有 http 和 https 两个选项。 第一。 https 会带来开销,可能是 5%-10%,但我不支付同一个数据中心的费用。 第二。 http 更快,但 Auth
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
我是一名优秀的程序员,十分优秀!