小编Ann*_*inn的帖子

基类的weak_ptr,而shared_ptr是派生类?

我有一个结构来管理从基类派生的对象Entity,但不控制它们的生命周期.我希望这个结构被赋予弱指针,weak_ptr<Entity>以便它可以知道对象是否已在其他地方被破坏.

但是,在共享指针所在的管理结构之外,我希望共享指针更具体shared_ptr<SpecificEntity> (SpecificEntity使用Entity作为基类).

有没有办法实现这个,或类似的东西?

c++ inheritance templates shared-ptr c++11

7
推荐指数
1
解决办法
1458
查看次数

将"Out of Memory"错误写入文件,没有内存?

如果程序内存不足,我想记录并可能警告用户,让他们有机会尝试释放一些(希望如此).虽然我可以预先分配显示情况所需的必要GUI实体,但我担心的是cstdio在这种情况下可能无法使用诸如打开或写入文件等更基本的操作.

我的问题是,如果程序根本无法动态分配内存,是否仍然可以使用cstdio?我是否需要采取任何特殊措施,例如将文件预先打开,或将其设置为不使用缓冲区?将cstring功能仍然能够发挥作用?在这种情况下要了解的其他任何障碍?

(警告用户在这种情况下很奢侈,主要目的是将错误记录到文件中,然后尝试使用cstdio抢救相关数据,然后按顺序警告用户)

c++ error-handling memory-management

6
推荐指数
1
解决办法
185
查看次数

是否有可能以每秒60次的点数据构建热图?

我正在进行模拟云(实际云),其中云被3D点模拟,然后投影到2D热图,大约640x480单位.点数大约是50k,这是我可以在没有模拟破坏的情况下尽可能小,但我似乎找不到以任何速度执行此操作的方法(通常需要3-5秒的运行时间)

我想我的问题是,普通计算机能够做到这一点是否可行?我通常低估了现在计算机的速度,但在这种情况下我可能会高估它们.我还没有对模拟进行优化,但如果不能实现模拟,那么现在就知道并省去麻烦是件好事.

如果有可能,是否有任何技术可以证明有助于从点数据到热图的转换速度足以每秒更新60次?它实际上只是查看点数据并在转换后将结果写入2D数组,因此我认为它主要与内存查找绑定.

c++ opengl simulation visualization heatmap

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

如何索引二十面体的面?

我正在编写一个模拟作用于横跨球体表面的网格.网格本身是一个细分的二十面体 (然而事先不知道细分的级别)

使用正方形网格,很容易找到相邻的单元格,因为它们沿x轴或y轴都是正负1.但是对于这些三角形来说情况并非如此,我的思绪很难想象一种索引细胞的方法.

我可以使用任何类型的坐标系来寻址二十面体的面,这至少可以让3个单元格与二十面体中的任意单元相邻吗?

c++ math geometry

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

包含在许多翻译单元中的静态常量的开销?

在头文件中,可以在一行中声明和(预)定义全局常量.

// constants.h
namespace Constant{
    static const unsigned int framerate = 60;
    static const char * const windowName = "Test";
    static const unsigned char * const cursorBitmap = { lots of data };
}
Run Code Online (Sandbox Code Playgroud)

我喜欢这种格式,因为它允许我将常量保存在一个位置,并且避免需要在一个文件中声明常量并在另一个文件中定义它,这有助于提高可读性.constants.h但是,当任何翻译单元包括时,它会按单位扩展这些定义.

我的问题是,如果我包含constants.h在许多翻译单元中,这会导致显着的开销,例如,cursorBitmap其他数组常量是否非常大?如果我将它包含在100个单元中,我的程序是否包含每个字符串和数组文字的100个副本?或者只会复制指针和值?

如果有开销,有没有办法可以避免它而不需要单独声明和定义?

(我也猜测'静态'在这个用法中是多余的,但我还是喜欢把它放在那里)

c++ static header constants

6
推荐指数
1
解决办法
556
查看次数

sizeof总是doubleof的倍数?

sizeof(Type)始终整除alignof(Type)

这样的陈述永远是真的吗? sizeof(Type) % alignof(Type) == 0

c++ sizeof memory-alignment

6
推荐指数
1
解决办法
192
查看次数

硬编码大数据集到可执行文件?

我想将大量数据(不同长度的整数数组,文本字符串库等)直接硬编码到可执行文件中,因此没有其他文件.

我的问题是,在C++中这样做最实用,最有条理的方法是什么?根据标题或源文件,我将在何处放置数据?我应该使用什么结构?

我意识到这不是处理数据的可接受方式.但幽默我!

c++

5
推荐指数
1
解决办法
1218
查看次数

每个结构只允许一个没有大小的数组?

我正在编写一个结构来描述我需要的常量值,并注意到一些奇怪的东西.

namespace res{
    namespace font{
        struct Structure{
            struct Glyph{
                int x, y, width, height, easement, advance;
            };
            int glyphCount;
            unsigned char asciiMap[];   // <-- always generates an error
            Glyph glyphData[];          // <-- never generates an error
        };
        const Structure system = {95, 
                              {
                                 // mapping data
                              }, 
                              {
                                 // glyph spacing data
                              }
        }; // system constructor
    } // namespace font
} // namespace res
Run Code Online (Sandbox Code Playgroud)

Structure非纯化数组的最后两个成员如果它们本身就不会停止编译器.但如果它们包含在结构的定义中,则会导致错误,说"类型不完整"

如果我给第一个数组一个大小,这将不再是一个问题.在这种情况下哪个不是问题,但我仍然好奇......

我的问题是,为什么我的struct中有一个unsized数组,但是有两个会导致问题?

c++ arrays visual-studio-2010

5
推荐指数
1
解决办法
1523
查看次数

从临时变量返回的引用是否有效?

我遇到过这样一种情况,即能够将方法调用链接到临时变量会非常有用:

draw(Quad(0, 0, 1, 1).rotate(90));  // <-- .rotate() returns a Quad reference

struct Quad{
    Quad(float x, float y, float width, float height){...}
    Quad & rotate(float degrees){
        ...
        return *this;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定临时变量是否会保持活动足够长时间以使draw()函数使用它.这样做安全吗?

c++ object-lifetime chaining

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

将一个结构放入比它小的内存中

我正在优化一种压缩算法,该算法使用跨 2 个字节的结构。但有时我希望它只解释 1 个字节,因为(我希望)映射到第二个字节的成员永远不会被写入或读取。

我是否能保证编译器不会访问第二个字节,只要 和zFmt永远wFmt不会被访问?如果不是,我可以编写一个静态断言,当这个假设错误时将停止编译吗?

struct Header {
    uint8_t xFmt : 4;
    uint8_t yFmt : 4;
    uint8_t zFmt : 4; // must not be read/written when header is mapped to 1 byte
    uint8_t wFmt : 4; // must not be read/written when header is mapped to 1 byte
};
    
static_assert( sizeof(Header) == 2 && alignof(Header) == 1, "alignment vital");


// --- usage ---
int main(){
    // Header may be placed into memory where it …
Run Code Online (Sandbox Code Playgroud)

c++ optimization strict-aliasing language-lawyer bit-fields

5
推荐指数
1
解决办法
150
查看次数