我正在用 C++ 实现一个简单的类,它只有一个必须是 unsigned char array
的属性和两种方法,一种获取和一种设置。我正在努力定义这个 unsigned char 数组。我将属性定义为指针,但 get 方法无法返回指针,因为这是未定义的行为。那我应该返回什么?和地址?如果我使用 &
该类无法编译。
何实现此类不返回指向本地“unsigned char 数组”的指针?
ps:我没有用std::vector<unsigned char>
或其他类型,因为它增加了 10 次返回值。使用 char 数组我得到 0.005 毫秒,使用 std::vector<unsigned char>
我有 0.07 毫秒。
class SkinnyBuffer {
private:
unsigned char* _value;
public:
~SkinnyBuffer();
SkinnyBuffer();
void setBufferValue(unsigned char value[]);
unsigned char& getBufferValue();;
};
#include "utils/SkinnyBuffer.h"
SkinnyBuffer::~SkinnyBuffer() {
}
SkinnyBuffer::SkinnyBuffer() {
}
void SkinnyBuffer::setBufferValue(unsigned char value[]) {
_value = value;
}
unsigned char SkinnyBuffer::getBufferValue() {
return _value;
}
最佳答案
这个问题有点不明确,但确实提供了一些可能性。
首先,你需要决定这些事情:
- 你想存储一个数组,还是一个指针?
- 目前您正在存储一个指针,尽管它可能指向一个数组。
- 你想返回一个数组,还是指向它第一个元素的指针?
- 不能返回数组
- 在这种情况下,您可以返回一个指针(它不是 UB,但
getBufferValue
需要返回一个unsigned char*
才能执行此操作编译),但你想要吗?
如果 SkinnyBuffer
的边界可以改变,那么存储一个指向一些动态分配内存的指针是合适的。为此,您应该改为使用 std::vector
,并且尽管您声称访问 vector 并不慢 — 您一定是不小心将它复制到某处或做了其他一些低效的事情。所以您可以进一步探索。
至于返回值,这又取决于您想要什么。实现一个提供对缓冲区的类元素访问的 operator[]
可能更符合逻辑。但是,那么,为什么要包装 vector 呢?只要有一个 vector !
如果您确实想返回一个指针,您将无法将其分配给数组类型的对象(尽管 Robert 的回答是这样声称的);您必须使用 std::copy
(或相关技术)一次复制一个元素。这是从 C 继承而来的限制,它不允许直接数组赋值。另请注意,返回的指针将是“弱”的,但也不会向在调用站点编写代码的程序员清楚地描述这一点,这是危险的;智能指针会让这变得更好。
最后,您问题的核心是这也适用于 setBufferValue
。您对类的输入只是复制一个指针,谁知道它指向什么?同样, vector 将使您的生活更加轻松。
最终这里有很多选择,“正确”的选择取决于您的实际需求以及您希望如何处理这些数据。
关于c++ - 在函数中返回 unsigned char 数组而不是指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52736763/