小编Ann*_*inn的帖子

C++自动关键字.为什么它很神奇?

从我以前学习C++的所有材料来看,auto一直是一个奇怪的存储持续时间说明符,它没有任何用途.但就在最近,我遇到的代码将其用作类型名称.出于好奇,我尝试了它,它假设我碰巧分配给它的类型!

突然间,STL迭代器以及使用模板的任何东西都比写入容易10倍.感觉就像我正在使用像Python这样的"有趣"语言.

这个关键词一直在哪里?你会说它是视觉工作室独有的还是不可移植的?

c++ types auto c++11

130
推荐指数
7
解决办法
10万
查看次数

Endianness什么时候成为一个因素?

根据我的理解,字节顺序是组成多字节字的字节顺序不同,至少在最典型的情况下.这样一个16位整数可以存储为0xHHLL或者0xLLHH.

假设我没有那个错误,我想知道的是,当Endian可能会或可能没有不同的两台计算机之间发送信息时,Endianness何时成为主要因素.

  • 如果我以char数组的形式传输1的短整数并且没有校正,它是否被接收并解释为256?

  • 如果我使用以下代码分解并重新组合短整数,那么字节序不再是一个因素吗?

    // Sender:
    for(n=0, n < sizeof(uint16)*8; ++n) {
        stl_bitset[n] = (value >> n) & 1;
    };
    
    // Receiver:
    for(n=0, n < sizeof(uint16)*8; ++n) {
        value |= uint16(stl_bitset[n] & 1) << n;
    };
    
    Run Code Online (Sandbox Code Playgroud)
  • 是否有补偿字节序的标准方法?

提前致谢!

c++ networking stl endianness

68
推荐指数
6
解决办法
7430
查看次数

在try/catch块中新建(std :: nothrow)与New

我在学习之后做了一些研究new,不像malloc()我习惯的那样,对于失败的分配没有返回NULL,并且发现有两种不同的方法来检查new是否成功.这两种方式是:

try
{
    ptr = new int[1024];
}
catch(std::bad_alloc& exc)
{
    assert();
};
Run Code Online (Sandbox Code Playgroud)

ptr = new (std::nothrow) int[1024];
if(ptr == NULL) 
    assert();
Run Code Online (Sandbox Code Playgroud)

我相信这两种方式可以实现相同的目标,(如果我当然错了,请纠正我!),所以我的问题是:

这是new完全基于可读性,可维护性和性能检查是否成功的更好选择,同时忽略了事实上的c ++编程约定.

c++ performance readability exception-handling

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

将任意三角形打包成有限的盒子?

我需要将三角形打包成一个盒子,尽可能合理,作为3D优化的一部分(我将使用不同纹理的片段填充到单个不同的纹理中,用于深度排序,因此纹理不会切换每一个新的三)

有这样做的算法吗?三角形本身可以制成可叠加的(可转换为直角,有效地使其成为盒填充算法),但我想尽可能避免这种情况,因为它会扭曲底层纹理艺术.

c++ opengl algorithm optimization

35
推荐指数
1
解决办法
933
查看次数

shared_ptr &lt;void&gt;如何知道要使用哪个析构函数?

我编写了以下代码,以查看a shared_ptr<void>作为最后引用a shared_ptr<Thing>并被销毁时的行为。

#include <iostream>
#include <string>
#include <memory>

using namespace std;

struct Thing{
    ~Thing(){
        cout<<"Destroyed\n";
    }
    int data;
};

int main(){
    {
        shared_ptr<void> voidPtr;
        {
            shared_ptr<Thing> thingPtr = make_shared<Thing>();
            voidPtr = thingPtr;
        }
        cout<<"thingPtr is dead\n";
    }
    cout<<"voidPtr is dead\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

哪个输出:

thingPtr is dead
Destroyed
voidPtr is dead
Run Code Online (Sandbox Code Playgroud)

它以我喜欢的方式运行,但是这完全是出乎意料的,我想了解这里发生了什么。最初的共享指针不再存在,最后只是一个shared_ptr<void>。因此,我希望这个共享指针的行为就像它持有a void*并且不知道有关Thing::~Thing(),但是它称之为。这是设计使然吧?void共享指针如何做到这一点?

c++ void shared-ptr

34
推荐指数
1
解决办法
1538
查看次数

OpenGL,如何创建"颠簸的多边形"?

我不确定如何描述我追求的东西,所以我画了一张图片来帮助:

OpenGL问题

我的问题是,在OpenGL中是否有可能在单个多边形上创建那些像素看起来凹凸的错觉,而不必诉诸于使用多个多边形?如果是的话,方法是什么?

c++ opengl 3d graphics

30
推荐指数
4
解决办法
1440
查看次数

分支预测和除零

我写的代码看起来像以下......

if(denominator == 0){
    return false;
}
int result = value / denominator;
Run Code Online (Sandbox Code Playgroud)

...当我考虑CPU中的分支行为时.

/sf/answers/785953171/ 这个答案说CPU将尝试正确猜测分支将走向哪个方向,并且如果发现分支错误地猜测分支,那么只停下该分支停止.

但是如果CPU预测上面的分支不正确,它将在以下指令中除以零.虽然这不会发生,我想知道为什么?CPU是否实际执行除零并在执行任何操作之前等待分支是否正确,还是可以告诉它在这些情况下不应该继续?这是怎么回事?

c++ error-handling optimization cpu-architecture branch-prediction

28
推荐指数
2
解决办法
1707
查看次数

如何将文件嵌入可执行文件?

我有一个用C++编写的小型演示可执行文件,它只依赖于在运行之前加载的一个5kb PNG图像,用于我制作的像素文本.由于这个文件,我需要提供一个ZIP存档而不是只有一个可执行文件,这会在下载和"播放"之间产生足够的摩擦,我相信这会阻止一些人尝试它.

我的问题是,无论如何将PNG文件(以及任何其他文件)真正嵌入到可执行文件或源代码中,以便它是一个文件,并且可执行文件可以使用它吗?

我能够将PNG解析为字节流,因此不需要将其转换为像素数据.

提前致谢!(存在与此类似标题的其他问题,但他们和他们的答案似乎涉及更具体的问题,并且不是很有帮助)

编辑:编译器是Visual C++ 2010,这是在Windows上(虽然我想避免Windows特定的实用程序)

edit2:Alf的答案看起来像是最便携的方法,所以我很快写了一个函数来将PNG文件解析成TXT或头文件,可以读作unsigned char数组.它在这种形式下似乎与PNG文件本身相同,但我的png加载器不接受该数组.从内存加载时,PNG解析器会接受(void * buffer, size_t length)它是否重要.

代码,如果你想看,但如果你认为它们比这个方法更好,我仍会接受其他答案:

void compileImagePNGtoBinary(char * filename, char * output){

    FILE * file = fopen(filename, "rb");
    FILE * out = fopen(output, "w");

    unsigned char buffer[32];
    size_t count;
    fprintf(out, "#pragma once \n\n static unsigned char TEXT_PNG_BYTES[] = { ");
    while(!feof(file)){
            count = fread(buffer, 1, 32, file);

            for(int n = 0; n < count; ++n){
                    fprintf(out, "0x%02X, ", buffer[n]);
            };
    };
    fprintf(out, "};"); …
Run Code Online (Sandbox Code Playgroud)

c++ executable file

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

当第一个向量重新分配时,另一个向量内的std :: vectors会重新分配吗?

我有一个矢量 std::vector<std::vector<ContactPairs>> m_contactPairs;

如果我调用m_contactPairs.push_back()或任何其他函数将调整最外层向量的大小,那么该向量内的元素是否必须重新分配(在这种情况下是内部元素std::vector<ContactPairs>),或者内部向量是否只做一个浅拷贝并保持指向同一个内存他们已经拥有?

我使用的是先前的C++ 11 Visual Studio 2010,但它具有一些扩展功能

c++ stl vector

19
推荐指数
2
解决办法
1018
查看次数

向下转换是否会破坏多态性的目的?

我今天在这里找到了一个问题,它为我提出了这个问题.

这是我所得到的伪代码示例:

class Car{
public:
    virtual int goFast() = 0;
};


class FordFocus : public Car {
public:
    int goFast(){
        return 35;
    };
};


class Lamborghini : public Car {
    bool roof;
public:
    int goFast(){
        return -1/0;  // crash 
    };
    void retractTheRoof(){
        roof = 0;
    };
};



class RichGuy {
    vector<Car *> cars;
public:
    void goDrive() {

        for(int i = 0; i < cars.size(); ++i) {
            if(Lamborghini* lambo = dynamic_cast<Lamborghini*>(cars[i])) {
                lambo->retractTheRoof();
            };
            goFast();
        };
    };
};
Run Code Online (Sandbox Code Playgroud)

在示例中,有一个 …

c++ oop polymorphism

17
推荐指数
2
解决办法
1788
查看次数