我在 C 中有一些代码,在整个代码中都使用了结构。我主要使用 memset 或 memcpy 将数据从缓冲区复制到缓冲区。
想知道这将在 C++ 中工作吗?' 根据 MSDN:
在 C++ 中,结构与类相同,只是其成员默认是公共的。
所以这意味着 C++ 编译器会将内部插入到结构对象中,而 memset 或 memcpy 将无法像在 C 中那样工作。
此外,“this”指针是否也适用于结构,有什么方法可以阻止编译器将任何 C++ 语言插入到我的对象中?
我在 C 中有一些代码,在整个代码中都使用了结构。我主要使用 memset 或 memcpy 将数据从缓冲区复制到缓冲区。
想知道这将在 C++ 中工作吗?' 根据 MSDN:
在 C++ 中,结构与类相同,只是其成员默认是公共的。
所以这意味着 C++ 编译器会将内部插入到结构对象中,而 memset 或 memcpy 将无法像在 C 中那样工作。
此外,“this”指针是否也适用于结构,有什么方法可以阻止编译器将任何 C++ 语言插入到我的对象中?
只要您的结构不使用任何 C++ 构造(虚拟主义等),memcpy
并且memset
即使在 C++ 中也可以使用它们。
另外,“this”指针是否适用于结构?
是的,this
指针适用于结构,因为它适用于类。
有什么办法可以阻止编译器将任何 C++ish 插入到我的对象中?
除非您对结构使用任何 C++ 构造,否则编译器不会。
您可以随意使用memXXXX
,只要您的struct
(or class
) 仅包含序数数据类型或由它们组成的结构/类,而不包含非平凡的 c'tors/d'tors(构造函数/析构函数)。
甚至事实是这 aclass
或 a struct
- 无关紧要。
所以这意味着 C++ 编译器会将内部插入到结构对象中
不,它没有。
并且 memset 或 memcpy 不会像在 C 中那样工作。
也不是这个意思。
你的猜测完全没有动机,你的问题仍然不清楚。
我在 C 中有一些代码,在整个代码中都使用了结构。我主要使用 memset 或 memcpy 将数据从缓冲区复制到缓冲区。
想知道这将在 C++ 中工作吗?' 根据 MSDN:
在 C++ 中,结构与类相同,只是其成员默认是公共的。
是的 - MSDN 是正确的,但这并不意味着复制 C++class
与复制 C 一样安全struct
,而是说结构可以像类一样复杂,而且通常也不安全。您绝对应该更喜欢移动以正确使用默认/复制构造的对象并放弃memset
/memcpy
操作。虽然memset
andmemcpy
可以在有限的情况下工作(基本上,当class
/struct
及其所有基础只包含在 C 中可以工作的东西时(指向虚拟调度表的指针不会被 memset 正确设置,但可能在memcpy
- 所有实现定义),并且不尝试维护任何不变量。在实践中,类通常具有不变量,或者在它们变得更加自我管理、封装代码/数据单元时引入它们:构造函数可以确保某些数据成员具有相关的、一致的、预期的值——而这些不变量被保持为真——而 memset 是可能会使除了最简单的之外的所有内容都无效-该类以后可能会表现出未定义的行为。
此外,“this”指针是否也适用于结构,有什么方法可以阻止编译器将任何 C++ 语言插入到我的对象中?
是的 - struct
C++ 中的 a 与 a 是同一种实体class
- 唯一的区别在于成员函数和数据的可见性/可访问性。两者都有this
指针。但是,这个指针不存储在类/结构中——它们是指向隐式提供给成员函数调用的此类对象的指针。memcpy
在(ab)使用和的上下文中,您不必担心这一点memset
。更一般地说,您唯一需要担心的 C++ 特定的事情是virtual
可能无效的函数和类不变量。您仍然需要担心 C 问题:memcpy
使用相同的资源(文件描述符、指向堆的指针、锁等)创建多个对象,其中两个对象都假定它们对该资源具有独占控制权,并稍后尝试删除/释放/释放它。