小编ima*_*ett的帖子

目录列表列宽

在进行目录列表(.htaccess"Options + Indexes")时,默认视图的列很窄.

我设置了一个目录来演示(它将在这个问题的持续时间内可用),其中包含我制作的一些公共领域的艺术作品:link.Firefox中的目录列表如下所示: 在此输入图像描述

Chrome,IE,Safari和Opera中的列表几乎完全相同.我关注的是"名称"列的宽度非常窄,特别是考虑到具有足够水平空间的全高清屏幕.

HTML是一个简单的表,例如"..>"表示在HTML中明确写入更长的文件名.所以这是由HTTP服务器本身生成的,我假设.

是否可以更改此行为以使文件名更长?如果没有,为什么?如果有,怎么样?

html .htaccess

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

Natvis 浮点格式

昨天我发现了MSVC 的“Natvis”工具,它允许您调整调试器以智能方式呈现您的类型。我很快着手美化我的数学图书馆。

这是我的 3*3 矩阵类的外观(未初始化的数据):

矩阵 3x3

华丽,对吧?我的下午没有后悔。

但是,现在我们要处理一个稍微复杂的案例:

矩阵 4x4

如您所见,数字不对齐。我想出了一个办法 讨厌缸与正数得到负数对齐,但我的方法没有接近这个(这是我的基本轮廓)的方式:

<Type ...>
    <DisplayString>...</DisplayString>
    <Expand ...>
        <Synthetic ...>
            <DisplayString ...>...</DisplayString>
        </Synthetic>
        ...
    </Expand>
</Type>
Run Code Online (Sandbox Code Playgroud)

发生的事情是打印的数字数量因数字而

因此我的问题是:我可以将 Natvis 配置为打印明确定义的位数以进行调试吗?或者,也许您有一个聪明的解决方法?


PS:如果我能成功,我很乐意上传生成“.natvis”文件的 Python 脚本,供你们玩自己的类型。

natvis visual-studio-2015

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

初始化未知维度的数组

我很惊讶我找不到这个问题.我试图将它(使用一些很好的未经测试的代码)推广到每个人都可以从中受益的东西.

假设我有一个多维Point:

template <int dims> class Point { public: double data[dims]; };
Run Code Online (Sandbox Code Playgroud)

现在我创建一个多维数组:

 template <int dims> void foobar(int count0, ...) {
    //Using variadic function.  Could also use variadic templates in C++ (arguably better)
    int counts[dims], total_count=count0; counts[0]=count0;
    va_list args; va_start(args,count0);
    for (int i=1;i<dims;++i) {
        int count = va_arg(args,int);
        counts[i] = count;
        total_count *= count;
    }
    va_end(args);

    Point<dims>* array = new Point<dims>[total_count];

    //...
}
Run Code Online (Sandbox Code Playgroud)

如您所见,array是一个未知维度的多维数组,以一维数组表示.


我的问题:我怎样才能将这个数组干净地初始化为多维网格点?

这是我想要的1,2和3维示例行为.显然,我不想为我可能想要使用的每个可能的维度编写这个!目标是概括这一点.

//Example: dim==1
for (int x=0; x<counts[0]; …
Run Code Online (Sandbox Code Playgroud)

c++ multidimensional-array

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

`uint64_t`有什么困难?(转换装配从`浮动`)

我处于需要计算类似事物的情况size_t s=(size_t)floorf(f);.也就是说,参数是一个浮点数,但它有一个整数值(假设floorf(f)它足够小,可以准确表示).在优化这一点的同时,我发现了一些有趣

以下是从float整数转换(GCC 5.2.0 -O3).为清楚起见,给出的转换是测试函数的返回值.

这是int32_t x=(int32_t)f:

    cvttss2si   eax, xmm0
    ret
Run Code Online (Sandbox Code Playgroud)

这是uint32_t x=(uint32_t)f:

    cvttss2si   rax, xmm0
    ret
Run Code Online (Sandbox Code Playgroud)

这是int64_t x=(int64_t)f:

    cvttss2si   rax, xmm0
    ret
Run Code Online (Sandbox Code Playgroud)

最后,这是uint64_t x=(uint64_t)f;:

    ucomiss xmm0, DWORD PTR .LC2[rip]
    jnb .L4
    cvttss2si   rax, xmm0
    ret
.L4:
    subss   xmm0, DWORD PTR .LC2[rip]
    movabs  rdx, -9223372036854775808
    cvttss2si   rax, xmm0
    xor rax, rdx
    ret

.LC2:
    .long   1593835520
Run Code Online (Sandbox Code Playgroud)

最后一个比其他的复杂得多.此外,Clang和MSVC表现相似.为方便起见,我将其翻译成伪C:

float lc2 = (float)(/* 2^63 - 1 */);
if (f<lc2) …
Run Code Online (Sandbox Code Playgroud)

floating-point assembly

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

如果非捕获的局部变量存在,为什么不能在Lambda中使用不合格的成员变量?

简单的例子:

class Foo {
    int x;

    void bar(int x) {
        [this]() -> void {
            x = 6;
        }();
    }
};
Run Code Online (Sandbox Code Playgroud)

这不能在GCC,Clang,MVC或ICC上编译(请参见实时).如果我换void bar(int x)void bar(int y),或者如果我换x = 6;this->x = 6;那么它工作正常.

这对我来说没有意义.x来自调用的局部变量bar故意不在lambda中捕获.唯一x有意义的是Foo成员变量.

问题:这是预期的行为,如果是这样,请解释原因?

c++ lambda shadowing language-lawyer

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

OpenGL 2纹理内部格式GL_RGB8I,GL_RGB32UI等

我正在重写我的纹理代码的很大一部分.我希望能够指定某些内部格式:GL_RGB8I,GL_RGB8UI,GL_RGB16I,GL_RGB16UI,GL_RGB32I和GL_RGB32UI.OpenGL 2中不存在这些令牌.

将这些内部格式指定为glTexImage2D的参数时,纹理会失败(纹理显示为白色).检查错误时,我得到[编辑:] 1282("无效操作").我认为这意味着OpenGL仍在使用OpenGL 2用于glTexImage2D,因此调用失败.显然,它需要使用更新的版本才能成功.像GL_RGB,GL_RGBA和(奇怪的)GL_RGB32F,GL_RGBA32F这样的枚举按预期工作.

我配置为使用GLEW或GLee进行扩展.我可以在其他地方使用OpenGL 4调用没有问题(例如,glPatchParameteri,glBindFramebuffer等),并且有问题的枚举肯定存在.为完整起见,glGetString(GL_VERSION)返回"4.2.0".我的问题:我可以强制使用其中一个扩展库来使用OpenGL 4.2版本吗?如果是这样,怎么样?

编辑:代码太复杂,无法发布,但这是一个使用GLee的简单,自包含的示例,也演示了这个问题:

#include <GLee5_4/GLee.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gl/glut.h>
//For Windows
#pragma comment(lib,"GLee.lib")
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glut32.lib")

#include <stdlib.h>
#include <stdio.h>

const int screen_size[2] = {512,512};
#define TEXTURE_SIZE 64

//Choose a selection.  If you see black, then texturing is working.  If you see red, then the quad isn't drawing.  If you see white, texturing has failed.
#define TYPE 1

void error_check(void) {
    GLenum error_code = glGetError();
    const GLubyte* error_string = …
Run Code Online (Sandbox Code Playgroud)

opengl textures

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

确认与MSVC 2015 RC中的分配器相关的此标准库错误

这是一个SSCCE:

#include <memory>
#include <vector>

template <class T> struct my_allocator : std::allocator<T> {
    //This overriding struct causes the error
    template <class U> struct rebind {
        typedef my_allocator<T> other;
    };

    //Ignore all this.
    typedef std::allocator<T> base;
    typename base::pointer allocate(typename base::size_type n, std::allocator<void>::const_pointer /*hint*/=nullptr) { return (T*)malloc(sizeof(T)*n); }
    void deallocate(typename base::pointer p, typename base::size_type /*n*/) { free(p); }
};

int main(int /*argc*/, char* /*argv*/[]) {
    std::vector<int,my_allocator<int>> vec;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC喜欢它.
ICC喜欢它.
Clang喜欢它.
甚至MSVC 2013都喜欢它.
但MSVC 2015 RC吐出:

1>------ Build …
Run Code Online (Sandbox Code Playgroud)

c++ bug-reporting visual-c++

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

获取最简单的`rsqrtss` Wrapper说明

我想是时候使用快速倒数平方根.所以,我尝试编写一个函数(将inline在生产中标记):

float sqrt_recip(float x) {
  return _mm_cvtss_f32( _mm_rsqrt_ss( _mm_set_ps1(x) ) ); //same as _mm_set1_ps
}
Run Code Online (Sandbox Code Playgroud)

TL; DR:我的问题是"如何让GCC和ICC为上述函数输出最小的汇编(两条指令),最好不要求助于原始汇编(坚持使用内在函数)?"

如上所述,在ICC 13.0.1,GCC 5.2.0和Clang 3.7上,输出为:

shufps  xmm0, xmm0, 0
rsqrtss xmm0, xmm0
ret
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为我曾经_mm_set_ps1分散x到寄存器的所有组件中.但是,我真的不需要这样做.我宁愿只做最后两行.当然,shufps只有一个周期.但rsqrtss只有三到五个.这是20%到33%的开销,完全没有价值.


我试过的一些事情:

  • 我试着不设置它:
    union { __m128 v; float f[4]; } u;
    u.f[0] = x;
    return _mm_cvtss_f32(_mm_rsqrt_ss(u.v));
    这实际上适用于Clang,但ICC和GCC的输出尤其令人震惊.

  • 您可以填充零(即使用_mm_set_ss),而不是散射.同样,GCC和ICC的输出都不是最佳的.在海湾合作委员会的案例中,海湾合作委员会搞笑地补充说:
    movss DWORD PTR [rsp-12], xmm0
    movss xmm0, DWORD PTR [rsp-12]


c++ assembly gcc icc

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

在 `switch` 语句中正确使用 C++20 `[likely]]`/`[[unlikely]]`

C++20 具有指导代码生成的方便[[likely]]/[[unlikely]]属性。例如,您可以指定一个分支可能被以下人员采用:

if (b) [[likely]] { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

同样,可以在switchstatements 中使用这些属性。. . 不知何故? 文档建议使用以下示例(稍微格式化):

if (b) [[likely]] { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

其含义显然是[[likely]]/[[unlikely]]case语句之前。互联网似乎几乎普遍宣传这种用法。

但是,请考虑以下类似的代码(我所做的只是将 the[[likely]]移到 other case):

switch (i) {
    case 1:
        [[fallthrough]];
    [[likely]] case 2:
        return 1;
}
Run Code Online (Sandbox Code Playgroud)

这无法在 clang 上编译!虽然这可能与编译器错误有关[[fallthrough]],但它让我查看了标准。在相关的标准有如下的例子(见§VII):

鼓励实现针对正在执行的情况进行优化(例如,以下代码中的值为 1):

switch (i) {
    [[likely]] case 1:
        [[fallthrough]];
    case 2:
        return 1;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,该属性出现案例标签之后,而不是之前。

所以 。. . …

c++ attributes switch-statement branch-prediction c++20

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

C++子结构位域大小

考虑以下:

class A { public:
    int     gate_type :  4;
    bool storage_elem :  1;
    uint8_t privilege :  2;
    bool      present :  1;
} __attribute__((packed));

class B { public:
    struct Sub {
        int     gate_type :  4;
        bool storage_elem :  1;
        uint8_t privilege :  2;
        bool      present :  1;
    } type_attr; //Also tried with "__attribute__((packed))" here in addition to outside
} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

编译器是g ++ 4.8.1.sizeof(A)== 1,sizeof(B)== 4.为什么会这样?我需要像结构B这样的东西,大小为1.

c++ bit-fields

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