小编ein*_*ica的帖子

当操作符超载时,如何可靠地获取对象的地址?

考虑以下程序:

struct ghost
{
    // ghosts like to pretend that they don't exist
    ghost* operator&() const volatile { return 0; }
};

int main()
{
    ghost clyde;
    ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( 
}
Run Code Online (Sandbox Code Playgroud)

我怎么得到clyde地址?

我正在寻找一种适用于所有类型对象的解决方案.C++ 03解决方案会很好,但我也对C++ 11解决方案感兴趣.如果可能,让我们避免任何特定于实现的行为.

我知道C++ 11的std::addressof函数模板,但我不想在这里使用它:我想了解标准库实现者如何实现这个函数模板.

c++ operator-overloading memory-address c++11

167
推荐指数
5
解决办法
2万
查看次数

delete会调用析构函数吗?

我有一个类(A),它为其中一个字段使用堆内存分配.A类被实例化并作为指针字段存储在另一个类(B)中.

当我完成对象B时,我调用delete,我假设调用了析构函数...但是这也调用了A类中的析构函数吗?

编辑:

从答案中,我接受了(请编辑,如果不正确):

  1. class A B的实例调用B :: ~B();
  2. 哪个叫 class B
  3. delete 应该显式地将delete所有堆分配的成员变量A;
  4. 最后,存储所述B实例的内存块返回到堆中 - 当使用new时,它首先在堆上分配一块内存,然后调用构造函数来初始化它,现在在调用所有析构函数来完成对象之后对象所在的块返回到堆.

c++ destructor memory-management base-class delete-operator

161
推荐指数
5
解决办法
27万
查看次数

gcc的ffast-math实际上做了什么?

我理解gcc的--ffast-math标志可以大大提高浮动操作的速度,并超出IEEE标准,但我似乎无法找到有关它正在发生的事情的信息.任何人都可以解释一些细节,并可能给出一个明确的例子,说明如果标志开启或关闭会有什么变化?

我确实尝试过挖掘SO以寻找类似的问题,但却找不到任何解释ffast-math工作原理的东西.

math floating-point performance gcc fast-math

138
推荐指数
2
解决办法
5万
查看次数

CUDA如何阻止/扭曲/线程映射到CUDA核心?

我已经使用CUDA几周了,但我对块/ warps/thread的分配有些怀疑. 我从教学的角度(大学项目)研究建筑,所以达到最佳表现并不是我关注的问题.

首先,我想了解我是否直截了当地得到了这些事实:

  1. 程序员编写内核,并在线程块网格中组织其执行.

  2. 每个块都分配给一个流式多处理器(SM).一旦分配,它就无法迁移到另一个SM.

  3. 每个SM将其自己的块拆分为Warps(当前最大大小为32个线程).warp中的所有线程在SM的资源上并发执行.

  4. 线程的实际执行由SM中包含的CUDA核执行.线程和核心之间没有特定的映射.

  5. 如果warp包含20个线程,但目前只有16个可用核心,则warp将不会运行.

  6. 另一方面,如果一个块包含48个线程,它将被分成2个warp并且它们将并行执行,前提是有足够的内存可用.

  7. 如果线程在核心上启动,则它会因内存访问或长时间浮点操作而停止,其执行可以在不同的核心上恢复.

他们是对的吗?

现在,我有一个GeForce 560 Ti,因此根据规格,它配备了8个SM,每个包含48个CUDA核心(总共384个核心).

我的目标是确保架构的每个核心都执行相同的SAME指令.假设我的代码不需要比每个SM中可用的代码更多的寄存器,我想象了不同的方法:

  1. 我创建了8个块,每个48个线程,因此每个SM有1个块来执行.在这种情况下,48个线程将在SM中并行执行(利用它们可用的所有48个内核)?

  2. 如果我推出64个6个线程的块,有什么区别吗?(假设它们将在SM之间平均映射)

  3. 如果我在预定的工作中"淹没"GPU(例如,创建每个1024个线程的1024个块),可以合理地假设所有核心将在某个点使用,并且将执行相同的计算(假设线程永远不会失速)?

  4. 有没有办法使用Profiler检查这些情况?

  5. 这个东西有没有参考?我阅读了"编程大规模并行处理器"和"CUDA应用程序设计与开发"中的CUDA编程指南和专用于硬件架构的章节; 但我无法得到准确的答案.

cuda gpgpu nvidia warp-scheduler

133
推荐指数
2
解决办法
6万
查看次数

118
推荐指数
3
解决办法
3万
查看次数

编写自己的STL容器

是否应该编写一个与任何STL容器一样的新容器?

c++ stl c++-standard-library

114
推荐指数
3
解决办法
5万
查看次数

C++模块 - 为什么它们从C++ 0x中删除?他们以后会回来吗?

我刚刚发现关于C++ 0x中模块的旧C++ 0x草案.

我们的想法是通过只编写.cpp文件退出当前的.h/.cpp系统,然后在编译过程中生成模块文件,然后由其他.cpp文件使用.

这看起来非常棒.

但我的问题是:为什么他们从C++ 0x删除它?是因为太多的技术难题?时间不够?你是否认为他们会考虑使用它来获得一个不可思议的C++版本?

c++ standards module language-extension c++11

110
推荐指数
3
解决办法
3万
查看次数

sizeof(bool)是否在C++语言标准中定义?

我在标准文档中找不到答案.C++语言标准是否要求sizeof(bool)始终为1(1个字节),还是要定义此大小的实现?

c++ boolean sizeof implementation-defined-behavior

107
推荐指数
3
解决办法
6万
查看次数

新标准版本的 C++ 中是否曾有过无声的行为变化?

(我正在寻找一两个例子来证明这一点,而不是一个列表。)

C++ 标准的变化(例如从 98 到 11、11 到 14 等)是否曾经改变了现有的、格式良好的、定义好的用户代码的行为——默默地?即在使用较新的标准版本进行编译时没有警告或错误?

笔记:

  • 我问的是标准规定的行为,而不是实现者/编译器作者的选择。
  • 代码越少越好(作为对这个问题的回答)。
  • 我不是指具有版本检测功能的代码,例如#if __cplusplus >= 201103L.
  • 涉及内存模型的答案很好。

c++ language-lawyer standardization

104
推荐指数
9
解决办法
6002
查看次数

使用MySQL,如何在表中生成包含记录索引的列?

有什么办法可以从查询中获取实际的行号吗?

我希望能够通过名为score的字段订购名为league_girl的表格; 并返回该用户名的用户名和实际行位置.

我想对用户进行排名,以便我可以分辨出特定用户的位置,即.乔是200中的第100位,即

User Score Row
Joe  100    1
Bob  50     2
Bill 10     3
Run Code Online (Sandbox Code Playgroud)

我在这里看到了一些解决方案,但我已经尝试了大部分解决方案,但实际上没有一个返回行号.

我试过这个:

SELECT position, username, score
FROM (SELECT @row := @row + 1 AS position, username, score 
       FROM league_girl GROUP BY username ORDER BY score DESC) 
Run Code Online (Sandbox Code Playgroud)

如派生的

...但它似乎没有返回行位置.

有任何想法吗?

mysql indexing

99
推荐指数
3
解决办法
14万
查看次数