小编kbi*_*irk的帖子

类成员和显式堆栈/堆分配

假设我们有4个课程如下:

class A
{
    public:           
        A(void) : m_B()
        {
        }
    private:
        B m_B;
}

class B
{
    public:            
        B(void)
        {
           m_i = 1;
        }
    private:
        int m_i;
}

class C
{
    public:           
        C(void) 
        {
            m_D = new D();
        }
        ~C(void) 
        {
            delete m_D;
        }
    private:
        D *m_D;
}

class D
{
    public:           
        D(void)
        {
           m_i = 1;
        }
    private:
        int m_i;
}
Run Code Online (Sandbox Code Playgroud)

可以说有4种情况:

情况1:在堆栈上外部分配,B在堆栈内部分配

A myA1;
Run Code Online (Sandbox Code Playgroud)

情况2:在堆上外部分配,B内部分配在堆栈上

A *myA2 = new A();
Run Code Online (Sandbox Code Playgroud)

情况3:C在堆栈外部分配,D在堆内部分配

C myC1;
Run Code Online (Sandbox Code Playgroud)

情况4:C在堆上外部分配,D在堆内部分配

C *myC2 = new …
Run Code Online (Sandbox Code Playgroud)

c++ memory heap stack memory-management

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

Variadic模板参数顺序,它们必须始终是最正确的参数吗?

我想修改现有的类构造函数:

template< typename T, typename... Ts >
MyClass( std::vector<T>& head, Ts& ...tail );
Run Code Online (Sandbox Code Playgroud)

这样就可以指定处理标志:

template< typename T, typename... Ts >
MyClass( MyEnum myEnum, std::vector<T>& head, Ts& ...tail );
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是我想知道是否有一种方法可以将它指定为最右边的参数,并且可能具有默认值.我从来没有见过像这样声明的变量模板,但是再一次,我找不到任何明确说明它们不可能的东西.我试过了:

template< typename T, typename... Ts >
MyClass( std::vector<T>& head, Ts& ...tail, MyEnum myEnum );

...

MyClass myClass( dataA, dataB, dataC, MyEnum::VALUE );
Run Code Online (Sandbox Code Playgroud)

但编译器不喜欢它,我假设它是由于可变参数模板如何解析而且它们必须是最右边的参数?

这在C++ 11中是否可行?

c++ templates variadic-templates c++11

15
推荐指数
2
解决办法
1384
查看次数

使用布局限定符时,未缓冲的顶点属性的OpenGL默认值

我假设这将是"未定义"的事情之一,但我似乎无法从谷歌找到具体的答案.

让我们在我的顶点着色器中说:

layout(location = 0) in vec3 vPosition;
layout(location = 1) in vec3 vNormal;
layout(location = 2) in vec4 vColour;
Run Code Online (Sandbox Code Playgroud)

但是没有任何缓冲到位置2的glEnableVertexAttribArray()或glVertexAttribPointer().我可以期待价值是什么特别的吗?

我假设vec4它将沿着{0,0,0,0},{0,0,0,1}或{1,1,1,1}的线,但在我的情况下,它是{0,0,1,1}.

当我之前使用glBindAttribLocation()指定位置时,它使用3种不同的操作系统(ubuntu 12.04,windows 7和ubuntu 10.04)在4台不同的机器上默认为{1,1,1,1}.

假设机器上的值为{0,0,1,1}是否安全?或者这简直是巧合?

opengl shader attributes vertex-buffer

10
推荐指数
1
解决办法
2079
查看次数

将矢量幅度减少特定长度的有效方法?

让我们说我有一个任意向量A.什么是减少任意数量的向量幅度最有效的方法?

我目前的方法如下:

Vector shortenLength(Vector A, float reductionLength) {

    Vector B = A;
    B.normalize();
    B *= reductionLength;
    return A - B;

}
Run Code Online (Sandbox Code Playgroud)

有没有更有效的方法来做到这一点?可能会删除标准化B所需的平方根...

c++ math vector linear-algebra

9
推荐指数
2
解决办法
7080
查看次数

原因不明的C++默认int值

我一直在重构一些代码,我注意到一些涉及未初始化的int数组的不稳定行为:

int arr[ARRAY_SIZE];
Run Code Online (Sandbox Code Playgroud)

我设置了一个断点,似乎所有值都默认为-858993460.这个价值有什么特别之处吗?任何想法为什么他们不默认为0?

c c++ visual-studio

8
推荐指数
2
解决办法
1万
查看次数

Visual Studio断点被移动

我最初使用的是Visual Studio C++ Express,我已经切换到终极版,我目前很困惑为什么调试器正在移动我的断点,例如:

if(x > y) {
    int z = x/y;         < --- breakpoint set here
}
int h = x+y;             < --- breakpoint is moved here during run time
Run Code Online (Sandbox Code Playgroud)

要么

random line of code      < --- breakpoint set here
random line of code

return someValue;        < --- breakpoint is moved here during run time
Run Code Online (Sandbox Code Playgroud)

它似乎在代码中的随机位置执行此操作.有时候我在这里做错了吗?我从未遇到像这样的快递版本的问题.

c++ debugging breakpoints visual-studio visual-c++

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

计算机之间的C对象文件兼容性

首先,我想说明这个问题与学校/家庭作业有关.

假设计算机CP1和CP2共享相同的操作系统和机器语言.如果在CP1上编译C程序,为了将其移动到CP2,是否需要传输源代码并在CP2上重新编译,或者只是传输目标文件.

我的直觉回答是目标文件应该足够了.C代码由编译器转换为汇编代码,并由汇编程序汇编为机器代码.因为架构共享相同的机器代码和操作系统,所以我没有看到问题.

但是我想的越多,我开始变得越困惑.

我的问题是:

a)由于它引用了目标文件而不是可执行文件,我假设没有链接.在CP2上链接时会出现任何问题吗?

b)如果代码在CP1上使用C11标准,但CP2上唯一的编译器是C99,这是否重要?我假设一旦代码编译/组装,这是无关紧要的.

c)该问题未指定共享/动态链接库.所以这只有在程序不依赖于.dll/.so/.dylib文件时才能真正起作用,否则CP2上也需要这些.

我觉得有这么多陷阱,考虑到问题是多么模糊,我现在觉得简单地重新编译会更安全.

HALP!

c compiler-construction assembly compatibility linker

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

Kryo序列化拒绝注册课程

我正在尝试使用kryo序列化:

kryo.setRegistrationRequired(true);
Run Code Online (Sandbox Code Playgroud)

我一直收到以下错误,说某个类没有注册:

java.lang.IllegalArgumentException: Class is not registered: com.my.package.MyClass[]
Note: To register this class use: kryo.register(com.my.package.MyClass[].class);
Run Code Online (Sandbox Code Playgroud)

但是,我注册了它:

kryo.register(classOf[MyClass[_]])
Run Code Online (Sandbox Code Playgroud)

当我设置Log.TRACE()时,我得到以下输出:

00:11 TRACE: [kryo] Register class ID 51: com.my.package.MyClass (com.esotericsoftware.kryo.serializers.FieldSerializer)
Run Code Online (Sandbox Code Playgroud)

当跟踪记录器打印出已注册时,为什么说它没有注册.我找不到有关此事的任何有用文件.有谁之前经历过这个吗?如果它有助于我运行Apache Spark v0.8.1

scala kryo

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

OpenGL Vertex缓冲区对象,我可以访问顶点数据以进行其他用途,例如碰撞检测吗?

我目前正在使用与Superbible第5版一起提供的GLTools课程.我正在查看GLTriangleBatch类,它具有以下代码:

// Create the master vertex array object
glGenVertexArrays(1, &vertexArrayBufferObject);
glBindVertexArray(vertexArrayBufferObject);


// Create the buffer objects
glGenBuffers(4, bufferObjects);

#define VERTEX_DATA     0
#define NORMAL_DATA     1
#define TEXTURE_DATA    2
#define INDEX_DATA      3

// Copy data to video memory
// Vertex data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_VERTEX);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pVerts, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, 0);

// Normal data
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_NORMAL);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pNorms, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0);

// Texture coordinates
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA]);
glEnableVertexAttribArray(GLT_ATTRIBUTE_TEXTURE0);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*2, pTexCoords, GL_STATIC_DRAW);
glVertexAttribPointer(GLT_ATTRIBUTE_TEXTURE0, 2, …
Run Code Online (Sandbox Code Playgroud)

opengl collision-detection vertex-buffer vertex vertex-array

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

GLSL如何确保最大可能的浮点值而不会溢出

据我所知,GLSL中没有FLT_MAX类型常量.

有没有办法确保浮点表示没有溢出的最大可能值?

编辑:

因为有人问我使用它是为了什么:

我基本上把一点指向"无限".它用于2D阴影投射,在那里我完全重塑了GPU上的三角形条带阴影.因为我只能控制一次处理单个顶点,w组件存储它是留在船体上还是投射到无穷大.

如果两个"阴影边界"点都是相同的边缘,并且光几乎与该边缘共线,我需要确保三角形仍然覆盖整个屏幕.很难描述.

opengl floating-point glsl overflow

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