C++ 中的结构

问题描述 投票:0回答:4

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

想知道这在 C++ 中行得通吗? ' 根据 MSDN :

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

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

另外,“this”指针也适用于结构吗?有什么方法可以阻止编译器将任何 C++ 风格的内容插入到我的对象中吗?

c++ struct
4个回答
3
投票

只要您的结构不使用任何 C++ 构造(虚拟主义等),

memcpy
memset
即使在 C++ 中也可以使用。

另外,'this'指针适用于结构体吗?
是的,

this
指针适用于结构,就像适用于类一样。

有什么方法可以阻止编译器将任何 C++ 风格的内容插入到我的对象中吗?
除非您在结构中使用任何 C++ 构造,否则编译器不会这样做。


1
投票

您可以随意使用

memXXXX
,只要您的
struct
(或
class
)仅包含序数数据类型或由这些数据类型组成的结构/类,没有不平凡的c'tors/d'tors(构造函数/析构函数)。

事实上,这是一个

class
struct
- 并不重要。


0
投票

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

想知道这在 C++ 中行得通吗? ' 根据 MSDN :

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

是的 - MSDN 是正确的,但这并不意味着复制 C++

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

另外,“this”指针也适用于结构吗?有什么方法可以阻止编译器将任何 C++ 风格的内容插入到我的对象中吗?

是的 - C++ 中的

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


0
投票

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

不,不是。

并且 memset 或 memcpy 将无法像 C 中那样工作。

也不是这个意思。

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

© www.soinside.com 2019 - 2024. All rights reserved.