我正在学习C++中的RAII习语,以及如何使用智能指针.
在我的阅读中,我遇到了两件对我来说似乎相互矛盾的事情.
引用自http://www.hackcraft.net/raii/:
...如果已经创建了具有RAII语义的成员对象并且在构造函数完成之前发生了异常,那么它的析构函数将作为堆栈展开的一部分被调用.因此,即使没有使用成员RAII对象完全构造,控制多个资源的对象也可以保护它们的清理.
但引自http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10:
如果构造函数抛出异常,则不会运行该对象的析构函数.如果您的对象已经完成了需要撤消的操作(例如分配一些内存,打开文件或锁定信号量),则必须通过对象内的数据成员记住这些"需要撤消的内容".
然后第二个链接源建议使用智能指针来处理已在构造函数中分配的事物的问题.
那么这些场景中究竟发生了什么?
struct Foo
{
Foo(int i)
{
ptr = new int(i);
}
~Foo()
{
delete ptr;
}
int* ptr;
};
int main()
{
{
Foo a(8);
Foo b(7);
a = b;
}
//Do other stuff
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,编译器将自动为其创建赋值运算符成员函数Foo
.但是,这只需要输入ptr
in 的值b
并将其放入a
.a
最初分配的内存似乎丢失了.我可以a.~Foo();
在进行赋值之前进行调用,但我听说你应该很少需要显式调用析构函数.所以让我们说我编写一个赋值运算符Foo
,删除int
左操作数的指针,然后将r值赋给l值.像这样:
Foo& operator=(const Foo& other)
{
//To handle self-assignment:
if (this != &other) {
delete this->ptr;
this->ptr = other.ptr;
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做,那么当Foo a
和Foo …
我在这里阅读CPU缓存上的维基百科:http://en.wikipedia.org/wiki/CPU_cache#Replacement_Policies
将一些内存范围标记为不可缓存可以通过避免缓存很少重新访问的内存区域来提高性能.这避免了将内容加载到缓存中的开销,而没有任何重用.
现在,我一直在阅读和学习如何编写具有更好缓存性能的程序(一般考虑因素,通常不是特定于C++),但我不知道高级代码可以明确地与CPU缓存行为进行交互.所以我的问题是,有没有办法在C++中完成我从那篇文章中引用的内容?
另外,我非常感谢有关如何在C++中提高缓存性能的资源,即使它们不使用任何直接处理CPU缓存的函数.例如,我想知道是否使用过多的间接层(例如,指针容器的指针容器)会损坏缓存性能.
我从官方网站下载了MinGW版本:http://sourceforge.net/projects/mingw/files/并将其安装在我的Windows 7机器上.
运行g++ --version
给了我g++.exe (GCC) 4.8.1
,我相信GCC 4.8.1支持C++ 11功能,包括线程.
运行g++ -std=c++11 main.cpp
成功编译以下程序.
//main.cpp
#include <memory>
int main() {
std::unique_ptr<int> a(new int);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但运行g++ -std=c++11 main.cpp
以下程序:
//main.cpp
#include <mutex>
int main() {
std::mutex myMutex;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出错误:
main.cpp: In function `int main()`:
main.cpp:5:5: error: 'mutex' is not a member of 'std'
std::mutex myMutex;
^
main.cpp:5:16: error: expected ';' before 'myMutex'
std::mutex myMutex;
^
Run Code Online (Sandbox Code Playgroud)
好像<mutex>
不受支持.编译器没有抱怨#include …
这段代码:
int a = 5;
int& b = a;
b = 7;
cout << a;
Run Code Online (Sandbox Code Playgroud)
打印出7,替换int& b
为int &b
打印7.
事实上也是如此int&b
,并int & b
.
我用一个简单的类来测试这种行为.一般来说,是否相对于类型和标识符放置&符号是否重要?谢谢.
我知道一些Java而且现在正在尝试使用C++而且显然在C++中你可以做一些事情,比如声明一个大小为6的int数组,然后改变那个数组的第10个元素,我理解它只是之后的第4个字节.为6整数数组分配的内存部分的结尾.
所以我的问题是,如果我不小心可能会意外地改变我的系统中其他程序正在使用的C++程序中的内存?是否存在以这种方式严重搞乱某些事情的实际风险?我的意思是我知道你可以重新启动计算机并清除内存,但如果我不这样做,可能会有一些持续的损害.
我正在尝试学习如何使用智能指针并了解所有权.当我auto_ptr
按值传递一个函数时,该函数将获取该指针的独占所有权.因此,当函数完成时,它会删除我传递给它的指针.
但是,当我尝试使用a时,我得到一个编译错误unique_ptr
,就好像为unique_ptr
s 禁用了复制赋值一样.通过unique_ptr
引用传递似乎不会转移所有权,它只是给函数一个引用unique_ptr
.
如何auto_ptr
将所有权转移到与unique_ptr
s 一起使用的功能?我希望得到一个详细教程的链接unique_ptr
,因为到目前为止,我所阅读的内容似乎只是谈论auto_ptr
或讨论Boost提供的智能指针,似乎忽略了unique_ptr
因为shared_ptr
它涵盖了它.
我正在使用Code :: Blocks IDE和GNU GCC编译器.
struct test
{
char a;
char e;
char f;
char b;
char d;
};
Run Code Online (Sandbox Code Playgroud)
sizeof(test)
回报5
.
我读到了这个答案: 为什么结构的sizeof不等于每个成员的sizeof之和?
为什么最后没有填充char
,所以sizeof(test)
返回6
或8
?一旦我添加short
等等int
,我可以提出更多问题.但我认为这个问题现在很好.填充不会使处理器更容易使用结构吗?
我想制作一个在互联网上运行的多人游戏,而不仅仅是局域网等低延迟,高吞吐量的环境.
我的游戏中有一些网络方面,UDP显然更适合,比如传输有关各种玩家的位置和速度的信息.必须尽快接收此数据,并且重新发送丢弃的数据包将无济于事,因为该数据在到达客户端时无关紧要.删除某些数据包是完全可以的.
但是,我的游戏还有一些其他方面严格要求按顺序保证交付.数据包的自动分段(分解和重新组合在一起)也非常有用.似乎TCP完成了所有这些.除非严格按顺序且没有丢失数据包,否则数据根本没用.在某些情况下,延迟将不可避免地受到此类数据的影响,但这是不可避免的.
因此,不是在UDP之上实现类似TCP的功能,(使用数据缓冲区,用数字标记数据包以确定它们的顺序,数据包确认系统),这将是确保其正常和有效工作的大量工作,我想同时使用TCP和UDP.
但是,我听说如果你同时使用它们,TCP和UDP可以互相争夺带宽,并且使用TCP会增加UDP丢弃数据包的速率.这是真的吗?在混合使用这两个协议时,还有其他问题需要处理吗?
我不知道如何在非常低的级别优化缓存性能,考虑缓存行大小或关联性.这不是你可以在一夜之间学到的东西.考虑到我的程序将在许多不同的系统和架构上运行,我认为无论如何都不值得.但是,我可能会采取一些措施来减少缓存缺失.
这是我的问题的描述:
我有一个3d数组的整数,表示空间中的点,如[x] [y] [z].每个尺寸都是相同的尺寸,所以它就像一个立方体.从那里我需要制作另一个3d数组,其中这个新数组中的每个值都是7个参数的函数:原始3d数组中的相应值,以及在空间中"触摸"它的6个索引.我现在不担心立方体的边角.
这就是我在C++代码中的意思:
void process3DArray (int input[LENGTH][LENGTH][LENGTH],
int output[LENGTH][LENGTH][LENGTH])
{
for(int i = 1; i < LENGTH-1; i++)
for (int j = 1; j < LENGTH-1; j++)
for (int k = 1; k < LENGTH-1; k++)
//The for loops start at 1 and stop before LENGTH-1
//or other-wise I'll get out-of-bounds errors
//I'm not concerned with the edges and corners of the
//3d array "cube" at the moment.
{
int value = input[i][j][k];
//I am expecting crazy …
Run Code Online (Sandbox Code Playgroud)