小编pla*_*cel的帖子

我们可以说0.5*x + 0.5*x == x总是如此吗?

0.5是(负)幂2,这意味着它可以完全由IEEE-754二进制浮点格式表示.在信号精确度方面0'01111110'00000000000000000000000.

根据我关闭优化的快速测试(-O0),结果是if y = 0.5 * x,然后y + y == x.但它是否始终由IEEE-754标准保证?

我知道,在一般的如果n是一个正整数幂2,并且m = 1.0 / n,y = m * x,然后加y在一起的n时候不会产生x.但似乎n = 2是的.

我错过了什么吗?

floating-point precision floating-accuracy ieee-754

4
推荐指数
1
解决办法
127
查看次数

VkAttachmentReference::layout 的目的是什么?

我试图理解为什么我们需要VkAttachmentReference::layout?文档说:

layoutVkImageLayout指定附件在子通道期间使用的布局的值。

换句话说,它告诉在子通道开始之前附件将转换到哪个布局。

但是这些信息已经可以通过VkAttachmentDescription::initialLayout. 这是文档中的引用:

initialLayout 是渲染过程实例开始时附件图像子资源将处于的布局。

是不是VkAttachmentReference::layout冗余,因为它完全重复VkAttachmentDescription::initialLayout

graphics rendering vulkan

4
推荐指数
1
解决办法
546
查看次数

为双向链表实现begin()和end()

我编写了自己的容器类,其原始内部数据结构是std::list.然后我需要创建自己的双向链表.我现在已经实现了我自己的双向链表以及链接列表的自己的迭代器,但是我遇到了问题std::list,特别是begin()end().

根据我的理解,begin()应该指向第一个节点,并且end()应该将一个元素指向最后一个元素.我需要确保当我调用时end(),我可以减少回到有效的最后一个元素.我还需要确保我可以做正常的遍历,比如......

while (beg != end ) { do something; beg++; }
Run Code Online (Sandbox Code Playgroud)

本质上,我的链表只使用包含数据元素的节点,指向前一节点的指针和指向下一个节点的指针.

当我第一次尝试实现我的时候end(),我只有最后一个节点的下一个指针是a nullptr.它可以单独工作,但不会像stl一样工作.

关于如何实现的任何意见begin()end()标准库做同样的方式?

c++ iterator linked-list list stdlist

3
推荐指数
1
解决办法
9532
查看次数

省略号作为任何可变参数模板之外的构造函数参数

请考虑以下代码:

#include <iostream>

struct S
{
    S(const char *p) { std::cout << '[' << p << ']'; }
};

int main()
{
    S var(...); // <------
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它在GCC 5.2上编译好-pedantic -pedantic-errors,但没有打印.我不知道这个语法意味着什么,我无法找到任何有关它的信息.

看起来它只是阻止了一个对象的构建,但我从来没有听说过这样的功能.

问题是:当用作构造函数参数时,省略号的含义什么?

c++

3
推荐指数
1
解决办法
200
查看次数

用于为 AVX shuffle 内在函数生成立即数的宏

在 AVX 中,是否有任何特殊的宏可以帮助构建_mm256_shuffle_*内部函数的立即常量,例如_MM_SHUFFLE(..)其 SSE 对应项?我找不到任何。

c macros intel intrinsics avx

3
推荐指数
1
解决办法
4062
查看次数

获取 std::any 的大小

有没有办法获得存储的数据的大小(以字节为单位)std::any?我想出的唯一解决方法是查询其值的类型,std::any::type并将结果与​​已知类型列表进行比较,例如my_any.type() == typeid(T),然后大小为sizeof(T). 不幸的是,此解决方案仅适用于事先知道类型的情况。

你知道有什么解决办法吗?

c++ sizeof type-erasure stdany

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

Vulkan 中如何确定曲面的大小?

我正在关注 Vulkan 教程,窗口表面部分表示在 Windows 上VkSurfaceKHR使用以下代码创建对象:

VkWin32SurfaceCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
createInfo.hwnd = glfwGetWin32Window(window);
createInfo.hinstance = GetModuleHandle(nullptr);

if (vkCreateWin32SurfaceKHR(instance, &createInfo, nullptr, &surface) != VK_SUCCESS) {
    throw std::runtime_error("failed to create window surface!");
}
Run Code Online (Sandbox Code Playgroud)

但我们从不指定对象表面的范围createInfo

然而,调用该vkGetPhysicalDeviceSurfaceCapabilitiesKHR函数会返回一个VkSurfaceCapabilitiesKHR对象,该对象具有一个currentExtent字段,根据文档该字段是

表面的当前宽度和高度,或特殊值(0xFFFFFFFF、0xFFFFFFFF),表示表面大小将由针对该表面的交换链的范围确定。

因此,在等于 (0xFFFFFFFF, 0xFFFFFFFF) 的特殊情况下,currentExtent我们知道表面的大小是由针对该表面的交换链决定的,但在所有其他情况下,表面似乎已经具有源自其他地方的大小,我们是期望将交换链的范围与该大小相匹配。

那么,当表面的大小不是由交换链确定时,它从何而来呢?

windows graphics gpu vulkan

3
推荐指数
1
解决办法
1524
查看次数

_mm_shuffle_epi8内在的用法

有人可以解释_mm_shuffle_epi8SSSE3内在吗?我知道它可以将16个8位整数混合在一起__m128i但不确定如何使用它.

我基本上想用来_mm_shuffle_epi8修改下面的函数以获得更好的性能.

while(not done)
    dest[i+0] = (src+j).a;
    dest[i+1] = (src+j).b;
    dest[i+2] = (src+j).c;
    dest[i+3] = (src+j+1).a;
    dest[i+4] = (src+j+1).b;
    dest[i+5] = (src+j+1).c;
    i+=6;
    j+=2;
Run Code Online (Sandbox Code Playgroud)

optimization performance x86 sse simd

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

Visual Studio 2012 Ultimate中的反汇编

我想在Visual Studio 2012 Ultimate中检查生成的C++代码编译器优化部分(发布)的汇编代码.网上有关于反汇编窗口的文章,但我无法访问它.

c++ debugging assembly visual-studio-2012

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

在OpenGL/CUDA中将顶点数据传输到GPU的最快方法

我必须在每一帧上只上传特定元素(数千个)的顶点数组 - 或者在第一个和最后一个更改的值之间的整个区域上传,但由于它有可能重新上传整个数组,因此效率非常低,无论如何,将上传许多未更改的值.

问题还包括将顶点数据上传到GPU的最快方法.

有几种方法可以做到:

glBufferData() / glBufferSubData()  // Standard upload to buffer
glBufferData()                      // glBufferData with double buffer
glMapBuffer()                       // Mapping video memory
cudaMemcpy()                        // CUDA memcopy from host to device vertex buffer
Run Code Online (Sandbox Code Playgroud)

哪个会是最快的?我特别关注CUDA方式,这与标准OpenGL方法有所不同.它比glBufferData()还是glMapBuffer()更快?

c++ opengl cuda vertex-buffer

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