gpt4 book ai didi

android - C++参数匹配/推导

转载 作者:行者123 更新时间:2023-11-28 01:33:13 26 4
gpt4 key购买 nike

我在 Android Oreo 源代码中阅读了一些我不太理解的代码。

首先,类IOMXNode有一个函数:

class IOMXNode : public IInterface {
public:
+-- 46 lines: DECLARE_HYBRID_META_INTERFACE(OMXNode, IOmxNode);-------------------------------------------------------------------------------------------------------------------------------

// Instructs the component to use the buffer passed in via |omxBuf| on the
// specified port. Returns in |*buffer| the buffer id that the component
// assigns to this buffer. |omxBuf| must be one of:
// 1) OMXBuffer::sPreset for meta-mode,
// 2) type kBufferTypeANWBuffer for non-meta-graphic buffer mode,
// 3) type kBufferTypeSharedMem for bytebuffer mode.
virtual status_t useBuffer(
OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) = 0;

useBuffer() 有三个参数,其中一个是const OMXBuffer&,它定义如下:

class OMXBuffer {
public:
// sPreset is used in places where we are referring to a pre-registered
// buffer on a port. It has type kBufferTypePreset and mRangeLength of 0.
static OMXBuffer sPreset;

// Default constructor, constructs a buffer of type kBufferTypeInvalid.
OMXBuffer();

// Constructs a buffer of type kBufferTypePreset with mRangeOffset set to
// |codecBuffer|'s offset and mRangeLength set to |codecBuffer|'s size (or 0
// if |codecBuffer| is NULL).
OMXBuffer(const sp<MediaCodecBuffer> &codecBuffer);

// Constructs a buffer of type kBufferTypePreset with specified mRangeOffset
// and mRangeLength.
OMXBuffer(OMX_U32 rangeOffset, OMX_U32 rangeLength);

// Constructs a buffer of type kBufferTypeSharedMem.
OMXBuffer(const sp<IMemory> &mem);

然后在某处调用此函数,例如:

sp<IOMXNode> mOMXNode;
...
sp<IMemory> mem;
...
err = mOMXNode->useBuffer(portIndex, mem, &info.mBufferID);

那么,为什么 sp<IMemory>可以直接匹配函数useBuffer()的第二个参数类型const OMXBuffer&吗?

我只能以某种方式将其放在一起,编译器使用 sp<IMemory>并构造一个OMXBuffer,然后匹配useBuffer()第二个参数。

这是归属类型推导还是其他我不知道的东西?

最佳答案

重要的行是这些(来自 OMXBuffer 类):

// Constructs a buffer of type kBufferTypeSharedMem.
OMXBuffer(const sp<IMemory> &mem);

那个converting constructor可以创建一个 OMXBuffer来自 sp<IMemory> 的对象对象。

这意味着真正发生的是

err = mOMXNode->useBuffer(portIndex, OMXBuffer(mem), &info.mBufferID);

也就是临时OMXBuffer对象是从 mem 创建的目的。然后是对该临时 OMXBuffer 的引用对象被传递给 useBuffer功能。而一旦useBuffer函数返回临时 OMXBuffer对象被破坏。

关于android - C++参数匹配/推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50674282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com