- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
A trivial class是平凡可复制的,并且有一个 trivial default constructor (trivial type 要么是其中之一,要么是工作方式类似的内置类)。
自 you can use memcpy
复制普通类型的对象,并且由于 default-initializing普通类型不会更改表示中的任何字节¹,以下代码(使用 C++20 概念)是否正确初始化传入对象的拷贝?
#include <cstdlib>
#include <cstring>
#include <new>
#include <type_traits>
template <typename T>
T* copy_trivial(T orig) requires std::is_trivial_v<T>
{
void* buf = std::aligned_alloc(alignof(T), sizeof(T));
// Note the order of these statements
std::memcpy(buf, &orig, sizeof(T));
return new(buf) T;
}
( Compiler Explorer ,提供了几个实例)
看起来这段代码可以工作,因为会有一个具有正确对象表示的初始化对象。但是,假设在 初始化之后没有发生任何事情,那么对象会不会有一个indeterminate value? ²?
¹ 未在单个位置指定,但默认初始化的链接过程调用构造函数,该构造函数必须是 implicitly defined ;隐式定义的构造函数 default-initializes all the members and bases ;并且该递归在 no initialization is performed 处触底对于内置的琐碎类型。
² [expr.new]p18.1中的注释说它会,但注释是非规范的,这似乎只是非放置 new
的情况。
最佳答案
does the following code (using C++20 concepts) correctly initialize a copy of the passed-in object?
不,它没有。
它确实返回一个指向有效 T
的指针,但是标准中没有任何内容要求 T
的值是 原件
。
普通类型的默认初始化被称为执行“无初始化”。但这与保留该内存的当前存储空间不同:[dcl.init]/12
When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if no initialization is performed for the object, that object retains an indeterminate value until that value is replaced.
请注意,它表示它保留“一个不确定值”,而不是“该内存中的相同值”。如果没有这种明确的保护,该标准不需要实现来保留内存的内容。
考虑调试构建。为了捕获错误,“未执行初始化”的情况有时会用特定字节填充未初始化的内存,以便您可以检测到何时访问未初始化的内存。只有当“不确定值”不在内存中保留当前值时,这对于实现才是合法的。
在 C++ 中无法使用另一个对象的字节拷贝来初始化一个对象。您可以对任意内存执行 memcpy,但您不能在该内存中显示一个对象来自该内存。您可以 memcpy 到现有对象中,但该对象已经被初始化(除非在创建时没有执行初始化)。
所以你能做的最好的事情就是颠倒这两个语句的顺序。
关于c++ - C++中普通类型的构造和初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51344835/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!