reinterpretCast

1 ffmpeg 解帧

1
ffmpeg -i DJI_20210615164633_0003_W.MP4 -r 3 images/%4d.jpg

2 reinterpret_cast<> 理解以及典型应用:

对于其他的例如static_cast<>等的应用,参考:http://www.cplusplus.com/doc/tutorial/typecasting/

以下引用自: https://stackoverflow.com/questions/573294/when-to-use-reinterpret-cast

Here is a variant of Avi Ginsburg’s program which clearly illustrates the property of reinterpret_cast mentioned by Chris Luengo, flodin, and cmdLP: that the compiler treats the pointed-to memory location as if it were an object of the new type:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

class A
{
public:
int i;
};

class B : public A
{
public:
virtual void f() {}
};

int main()
{
string s;
B b;
b.i = 0;
A* as = static_cast<A*>(&b);
A* ar = reinterpret_cast<A*>(&b);
B* c = reinterpret_cast<B*>(ar);

cout << "as->i = " << hex << setfill('0') << as->i << "\n";
cout << "ar->i = " << ar->i << "\n";
cout << "b.i = " << b.i << "\n";
cout << "c->i = " << c->i << "\n";
cout << "\n";
cout << "&(as->i) = " << &(as->i) << "\n";
cout << "&(ar->i) = " << &(ar->i) << "\n";
cout << "&(b.i) = " << &(b.i) << "\n";
cout << "&(c->i) = " << &(c->i) << "\n";
cout << "\n";
cout << "&b = " << &b << "\n";
cout << "as = " << as << "\n";
cout << "ar = " << ar << "\n";
cout << "c = " << c << "\n";

cout << "Press ENTER to exit.\n";
getline(cin,s);
}

Which results in output like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
as->i = 0
ar->i = 50ee64
b.i = 0
c->i = 0

&(as->i) = 00EFF978
&(ar->i) = 00EFF974
&(b.i) = 00EFF978
&(c->i) = 00EFF978

&b = 00EFF974
as = 00EFF978
ar = 00EFF974
c = 00EFF974
Press ENTER to exit.

It can be seen that the B object is built in memory as B-specific data first, followed by the embedded A object. The static_cast correctly returns the address of the embedded A object, and the pointer created by static_cast correctly gives the value of the data field. The pointer generated by reinterpret_cast treats b’s memory location as if it were a plain A object, and so when the pointer tries to get the data field it returns some B-specific data as if it were the contents of this field.

应用如下:
下面的应用根据输入的类型T判断后使用了reinterpret_cast去转换;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename T>
void OptionManager::RegisterOption(const std::string& name, const T* option) {
if (std::is_same<T, bool>::value) {
options_bool_.emplace_back(name, reinterpret_cast<const bool*>(option));
} else if (std::is_same<T, int>::value) {
options_int_.emplace_back(name, reinterpret_cast<const int*>(option));
} else if (std::is_same<T, double>::value) {
options_double_.emplace_back(name, reinterpret_cast<const double*>(option));
} else if (std::is_same<T, std::string>::value) {
options_string_.emplace_back(name,
reinterpret_cast<const std::string*>(option));
} else {
LOG(FATAL) << "Unsupported option type";
}
}