在进行目录列表(.htaccess"Options + Indexes")时,默认视图的列很窄.
我设置了一个目录来演示(它将在这个问题的持续时间内可用),其中包含我制作的一些公共领域的艺术作品:link.Firefox中的目录列表如下所示:
Chrome,IE,Safari和Opera中的列表几乎完全相同.我关注的是"名称"列的宽度非常窄,特别是考虑到具有足够水平空间的全高清屏幕.
HTML是一个简单的表,例如"..>"表示在HTML中明确写入更长的文件名.所以这是由HTTP服务器本身生成的,我假设.
是否可以更改此行为以使文件名更长?如果没有,为什么?如果有,怎么样?
昨天我发现了MSVC 的“Natvis”工具,它允许您调整调试器以智能方式呈现您的类型。我很快着手美化我的数学图书馆。
这是我的 3*3 矩阵类的外观(未初始化的数据):
华丽,对吧?我的下午没有后悔。
但是,现在我们要处理一个稍微复杂的案例:
如您所见,数字不对齐。我想出了一个办法 讨厌缸与正数得到负数对齐,但我的方法没有接近这个(这是我的基本轮廓)的方式:
<Type ...>
<DisplayString>...</DisplayString>
<Expand ...>
<Synthetic ...>
<DisplayString ...>...</DisplayString>
</Synthetic>
...
</Expand>
</Type>
Run Code Online (Sandbox Code Playgroud)
发生的事情是打印的数字数量因数字而异。
因此我的问题是:我可以将 Natvis 配置为打印明确定义的位数以进行调试吗?或者,也许您有一个聪明的解决方法?
PS:如果我能成功,我很乐意上传生成“.natvis”文件的 Python 脚本,供你们玩自己的类型。
我很惊讶我找不到这个问题.我试图将它(使用一些很好的未经测试的代码)推广到每个人都可以从中受益的东西.
假设我有一个多维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) 我处于需要计算类似事物的情况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) 简单的例子:
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
成员变量.
问题:这是预期的行为,如果是这样,请解释原因?
我正在重写我的纹理代码的很大一部分.我希望能够指定某些内部格式: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) 这是一个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) 我想是时候使用快速倒数平方根.所以,我尝试编写一个函数(将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++20 具有指导代码生成的方便[[likely]]
/[[unlikely]]
属性。例如,您可以指定一个分支可能被以下人员采用:
if (b) [[likely]] { /*...*/ }
Run Code Online (Sandbox Code Playgroud)
同样,可以在switch
statements 中使用这些属性。. . 不知何故? 文档建议使用以下示例(稍微格式化):
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)
也就是说,该属性出现在案例标签之后,而不是之前。
所以 。. . …
考虑以下:
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++ ×6
assembly ×2
.htaccess ×1
attributes ×1
bit-fields ×1
c++20 ×1
gcc ×1
html ×1
icc ×1
lambda ×1
natvis ×1
opengl ×1
shadowing ×1
textures ×1
visual-c++ ×1