我是一个简单的程序员.我的类成员变量通常由POD类型和STL容器组成.因此,我很少需要编写赋值运算符或复制构造函数,因为这些是默认实现的.
除此之外,如果我使用std::move
不可移动的对象,它使用赋值运算符,这意味着std::move
非常安全.
由于我是一个简单的程序员,我想利用移动功能,而不需要为我编写的每个类添加移动构造函数/赋值运算符,因为编译器可以简单地将它们实现为" this->member1_ = std::move(other.member1_);...
"
但它没有(至少在Visual 2010中没有),有什么特别的原因吗?
更重要的是; 有没有办法解决这个问题?
更新: 如果你低头看GManNickG的答案,他会为此提供一个很棒的宏.如果你不知道,如果你实现了移动语义,你可以删除交换成员函数.
通俗地说,琐碎类型,标准布局类型和POD之间有什么区别?
具体来说,我想确定是否new T
与new T()
任何模板参数不同T
.哪种类型的性状is_trivial
,is_standard_layout
而且is_pod
我应该选择?
(作为一个附带问题,可以在没有编译器魔法的情况下实现任何这些类型特征吗?)
嗨,
在C++ In a Nutshell一书中,在第6章:类中,在Access说明符下面,提到了以下内容:
在类定义中,成员和基类的默认访问权限是私有的.在结构定义中,默认值为public.这是类和结构之间的唯一区别,尽管按照惯例,一些程序员仅将结构用于POD类,并将类用于所有其他类.
我的问题是:
谢谢.
IP_ADAPTER_INFO *ptr=new IP_ADAPTER_INFO[100];
Run Code Online (Sandbox Code Playgroud)
如果我免费使用
delete ptr;
Run Code Online (Sandbox Code Playgroud)
它会导致内存泄漏,如果不是那么为什么?
这是VS2005生成的反汇编代码
; delete ptr;
0041351D mov eax,dword ptr [ptr]
00413520 mov dword ptr [ebp-0ECh],eax
00413526 mov ecx,dword ptr [ebp-0ECh]
0041352C push ecx
0041352D call operator delete (4111DBh)
00413532 add esp,4
; delete []ptr;
00413535 mov eax,dword ptr [ptr]
00413538 mov dword ptr [ebp-0E0h],eax
0041353E mov ecx,dword ptr [ebp-0E0h]
00413544 push ecx
00413545 call operator delete[] (4111E5h)
0041354A add esp,4
Run Code Online (Sandbox Code Playgroud) 我正在研究C++ 11中新的,轻松的POD定义(第9.7节)
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),也没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,
- 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类.
我突出了让我感到惊讶的一些事情.
如果我们容忍具有不同访问控制的数据成员会出什么问题?
如果第一个数据成员也是基类会出什么问题?即
struct Foo {};
struct Good : Foo {int x; Foo y;};
struct Bad : Foo {Foo y; int x;};
Run Code Online (Sandbox Code Playgroud)
我承认这是一个奇怪的结构,但为什么要Bad
被禁止但不是Good
?
最后,如果不止一个组成类有数据成员,会出现什么问题?
有什么建议我如何记录我的Perl代码?您使用了什么以及可以使用哪些工具来帮助我?
您使用哪个模块将pod转换为html?
比方说,我有一个struct RGB
,我想创建struct RGBA
,继承RGB
:
struct RGB {
unsigned char r;
unsigned char g;
unsigned char b;
};
struct RGBA: RGB {
unsigned char a;
};
Run Code Online (Sandbox Code Playgroud)
两者都将用于读取未压缩的图像数据:
RGBA *pixel=static_cast<RGBA *>(image->uncompressed_data);
Run Code Online (Sandbox Code Playgroud)
问题:关于内存布局,这样安全struct RGBA
吗?有人保证:
unsigned char a
之后RGB struct
(不是之前)struct RGB
和参数来自struct RGBA
?会有#pragma pack
帮助吗?这都是关于继承期间的内存布局.
我和一位同事进行了这次谈话,结果很有趣.假设我们有以下POD课程
struct A {
void clear() { memset(this, 0, sizeof(A)); }
int age;
char type;
};
Run Code Online (Sandbox Code Playgroud)
clear
旨在清除所有成员,设置为0
(按字节顺序).如果我们A
用作基类会出现什么问题?这里有一个微妙的漏洞来源.
任何人都能解释rvalues,左值,POD和非POD方面的细节,下面标记的第一个表达式不正确而下面标记的第二个表达式是否正常?根据我的理解,int()和A()都应该是rvalues,不是吗?
struct A {};
int main()
{
int i;
A a;
int() = i; //Not OK (error).
A() = a; //OK.
return 0;
}
Run Code Online (Sandbox Code Playgroud) 今天早上我问自己一些事情,我找不到正确"谷歌"的话:
让我们说:
struct Foo
{
int bar;
};
struct Foo2
{
int bar;
Foo2() {}
};
struct Foo3
{
int bar;
Foo3() : bar(0) {}
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我默认实例化Foo
,Foo2
并且Foo3
:
Foo foo;
Foo2 foo2;
Foo3 foo3;
Run Code Online (Sandbox Code Playgroud)
在哪种情况下,bar
会员是否正确初始化?
(Foo3
显然很明显地初始化它,并且只在这里显示明确差异Foo2
所以问题主要是关于前两个.)
谢谢 !:)
pod ×10
c++ ×9
c++11 ×2
class ×1
constructor ×1
inheritance ×1
lvalue ×1
memset ×1
perl ×1
rvalue ×1
struct ×1
type-traits ×1