使用时分配数组时new [],为什么不能从指针中找出该数组的大小?它必须在运行时delete []知道,否则不知道要释放多少内存.
除非我错过了什么?
据我所知,C++ 0x中的模板别名将允许我们执行以下操作:
template <typename T>
using Dictionary = std::map< std::string, T >;
Dictionary<int> ints;
ints[ "one" ] = 1;
ints[ "two" ] = 2;
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
首先,我们能够做到这一点(绑定到任何类型,或只是模板):
template <typename Iter>
using ValueType = std::iterator_traits<Iter>::value_type;
Run Code Online (Sandbox Code Playgroud)
其次,使用别名需要typename在模板中使用关键字,例如:
template <typename Iter>
typename ValueType<Iter> sum(Iter first, Iter last) { ... }
// ^ required?
Run Code Online (Sandbox Code Playgroud)
或者在别名声明中是否需要它?
using ValueType = typename std::iterator_traits<Iter>::value_type;
// ^ required?
Run Code Online (Sandbox Code Playgroud)
或者都不是?
对于某些图形工作,我需要尽快读取大量数据,理想情况下是直接读取和写入数据结构到磁盘.基本上我有各种各样的文件格式的3D模型,加载时间太长,所以我想把它们以"准备好"的格式写出来作为缓存,在后续的程序运行中加载速度要快得多.
这样做是否安全?我担心的是直接读入载体的数据?我已经删除了错误检查,硬编码4作为int的大小等等,所以我可以给出一个简短的工作示例,我知道这是错误的代码,我的问题是如果在c ++中读取整个数组是安全的结构直接进入这样的矢量?我相信它是这样的,但是当你开始进入低级并直接处理像这样的原始内存时,c ++有很多陷阱和未定义的行为.
我意识到数字格式和大小可能会在平台和编译器之间发生变化,但这只会由同一个编译器程序读取和写入,以缓存稍后运行同一程序时可能需要的数据.
#include <fstream>
#include <vector>
using namespace std;
struct Vertex
{
float x, y, z;
};
typedef vector<Vertex> VertexList;
int main()
{
// Create a list for testing
VertexList list;
Vertex v1 = {1.0f, 2.0f, 3.0f}; list.push_back(v1);
Vertex v2 = {2.0f, 100.0f, 3.0f}; list.push_back(v2);
Vertex v3 = {3.0f, 200.0f, 3.0f}; list.push_back(v3);
Vertex v4 = {4.0f, 300.0f, 3.0f}; list.push_back(v4);
// Write out a list to a disk file
ofstream os ("data.dat", ios::binary);
int size1 = list.size();
os.write((const …Run Code Online (Sandbox Code Playgroud) 为什么Phobos enum用来定义常量?例如,在std.math中:
enum real E = 2.7182818284590452354L;
Run Code Online (Sandbox Code Playgroud)
为什么不使用全球immutable?有什么优势/劣势enum了immutable?
我只是要经历一堆C++面试问题,以确保没有任何明显的我不知道.到目前为止,我还没有找到任何我不知道的东西,除了这个:
long value;
//some stuff
value &= 0xFFFF;
Run Code Online (Sandbox Code Playgroud)
问题是"这段代码出了什么问题?" 并暗示这与目标架构有关.
除非答案只是"价值未初始化",否则我看不出任何问题.据我所知,它只是掩盖了值的2个最低有效字节,并且long保证至少为2个字节,因此没有问题.
可能是long目标架构上可能只有2个字节,你可能会丢失符号位吗?或者也许0xFFFF是一个int而且int只有2个字节?
提前致谢.
由于遗留原因,我需要使用侵入式指针,因为我需要能够将原始指针转换为智能指针.
但是我注意到没有弱的侵入式指针可以提升.我确实在boost线程列表上找到了关于它的讨论,但没有具体的.
有谁知道弱侵入指针的线程安全实现?
谢谢Rich
void foo() {
struct Foo { .. };
std::vector<Foo> vec; // why is this illegal?
}
Run Code Online (Sandbox Code Playgroud)
我不会把Foo归还外面的世界.它只是我在函数中使用的临时类型.
这是我的要求,我知道某些算法很好地利用了Cache,有些算法没有,有些算法在特定数据集上做了比其他算法更多的I/O等等.我想看看并分析自己发生的事情.
所以我想知道是否有一种方法我可以知道如何读取某个内存/变量,即它是来自缓存,还是存在缓存未命中.此外,如果在检索此值时出现页面错误等.
非常感谢!
D有两种类型的const:不可变变量是声明为不可变的变量,并且总是不可变的,而const变量只是对象的只读版本.
逻辑const是将函数标记为const,但允许对一个或多个成员变量进行写访问.这种方法的典型用途是进行惰性评估,例如(在C++中)
struct Matrix
{
double determinant() const
{
if ( m_dirty )
{
m_determinant = /* expensive calculation */;
m_dirty = false;
}
return m_determinant;
}
void set(int i, int j, double x) { m_dirty = true; ...; }
mutable bool m_dirty;
mutable double m_determinant;
};
Run Code Online (Sandbox Code Playgroud)
在这里,determinant()是const,但仍然可以修改m_dirty,m_determinant因为它们被标记为mutable.
该d常量(FAQ)说,D2不支持,因为它提供了,这是造成障碍编写并发程序,并使得一定的优化更加困难弱势保证逻辑常量.
我完全理解这个问题,但是如果我们需要逻辑const呢?
考虑上面的情况与Matrix类,但没有缓存(和任何需要逻辑const).还想象一下,这个类在我的代码库中使用,并且主要通过const引用访问.
现在考虑分析已经揭示该determinant()函数是代码中的瓶颈,而且它通常被重复访问,其值很少改变,即如上所述的缓存将是完美的优化.
没有逻辑const我怎么能这样做呢?遍及我的代码库将const引用更改为非const引用不是一种选择(出于显而易见的原因). …