0

我在 C 中有一些代码,在整个代码中都使用了结构。我主要使用 memset 或 memcpy 将数据从缓冲区复制到缓冲区。

想知道这将在 C++ 中工作吗?' 根据 MSDN:

在 C++ 中,结构与类相同,只是其成员默认是公共的。

所以这意味着 C++ 编译器会将内部插入到结构对象中,而 memset 或 memcpy 将无法像在 C 中那样工作。

此外,“this”指针是否也适用于结构,有什么方法可以阻止编译器将任何 C++ 语言插入到我的对象中?

4

4 回答 4

3

只要您的结构不使用任何 C++ 构造(虚拟主义等),memcpy并且memset即使在 C++ 中也可以使用它们。

另外,“this”指针是否适用于结构?
是的,this指针适用于结构,因为它适用于类。

有什么办法可以阻止编译器将任何 C++ish 插入到我的对象中?
除非您对结构使用任何 C++ 构造,否则编译器不会。

于 2012-05-14T06:00:35.480 回答
1

您可以随意使用memXXXX,只要您的struct(or class) 仅包含序数数据类型或由它们组成的结构/类,而不包含非平凡的 c'tors/d'tors(构造函数/析构函数)。

甚至事实是这 aclass或 a struct- 无关紧要。

于 2012-05-14T05:59:49.990 回答
0

所以这意味着 C++ 编译器会将内部插入到结构对象中

不,它没有。

并且 memset 或 memcpy 不会像在 C 中那样工作。

也不是这个意思。

你的猜测完全没有动机,你的问题仍然不清楚。

于 2012-05-14T09:41:28.680 回答
0

我在 C 中有一些代码,在整个代码中都使用了结构。我主要使用 memset 或 memcpy 将数据从缓冲区复制到缓冲区。

想知道这将在 C++ 中工作吗?' 根据 MSDN:

在 C++ 中,结构与类相同,只是其成员默认是公共的。

是的 - MSDN 是正确的,但这并不意味着复制 C++class与复制 C 一样安全struct,而是说结构可以像类一样复杂,而且通常也不安全。您绝对应该更喜欢移动以正确使用默认/复制构造的对象并放弃memset/memcpy操作。虽然memsetandmemcpy可以在有限的情况下工作(基本上,当class/struct及其所有基础只包含在 C 中可以工作的东西时(指向虚拟调度表的指针不会被 memset 正确设置,但可能在memcpy- 所有实现定义),并且不尝试维护任何不变量。在实践中,类通常具有不变量,或者在它们变得更加自我管理、封装代码/数据单元时引入它们:构造函数可以确保某些数据成员具有相关的、一致的、预期的值——而这些不变量被保持为真——而 memset 是可能会使除了最简单的之外的所有内容都无效-该类以后可能会表现出未定义的行为。

此外,“this”指针是否也适用于结构,有什么方法可以阻止编译器将任何 C++ 语言插入到我的对象中?

是的 - structC++ 中的 a 与 a 是同一种实体class- 唯一的区别在于成员函数和数据的可见性/可访问性。两者都有this指针。但是,这个指针不存储在类/结构中——它们是指向隐式提供给成员函数调用的此类对象的指针。memcpy在(ab)使用和的上下文中,您不必担心这一点memset。更一般地说,您唯一需要担心的 C++ 特定的事情是virtual可能无效的函数和类不变量。您仍然需要担心 C 问题:memcpy使用相同的资源(文件描述符、指向堆的指针、锁等)创建多个对象,其中两个对象都假定它们对该资源具有独占控制权,并稍后尝试删除/释放/释放它。

于 2012-05-14T09:12:15.463 回答