小编Ale*_*der的帖子

C++ 对齐 new[]

概述

当浏览operator new、operator new[] - cppreference.com时,我们似乎有很多选项来分配具有特定对齐要求的对象数组。但是,没有指定如何使用它们,而且我似乎找不到正确的 C++ 语法。

我可以以某种方式显式调用该运算符,还是编译器会自动推断重载?:

void* operator new[]( std::size_t count, std::align_val_t al );
Run Code Online (Sandbox Code Playgroud)

看看Bartek的编码博客,似乎编译器会根据对齐要求是否大于__STDCPP_DEFAULT_NEW_ALIGNMENT__(在64位机器上通常为16)自动选择重载。

问题

在某些情况下是否可以手动为new操作员选择重载?有时我可能希望分配的块以某种方式对齐(我假设对齐始终是 2 的幂,并且可能大于 16)。

编译器的选择

在可预见的将来,我可能会使用 GCC 和 C++ >= 17。

c++ memory-alignment c++17

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

如何测量Vulkan管道的执行时间

概括

我希望能够测量 GPU 上运行整个图形管道所花费的时间(以毫秒为单位)。目标:能够在优化代码之前/之后保存基准(下一步将是 mipmap 纹理)以查看改进。这在 OpenGL 中非常简单,但我是 Vulkan 的新手,需要一些帮助。

我浏览了相关的现有答案(此处此处),但它们并没有太大帮助。而且我在任何地方都找不到代码示例,所以我敢在这里提问。

通过文档页面,我发现了一些我认为应该使用的函数,因此我设置了如下所示的功能:

1:创建查询池

void CreateQueryPool()
{
    VkQueryPoolCreateInfo createInfo{};
    createInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
    createInfo.pNext = nullptr; // Optional
    createInfo.flags = 0; // Reserved for future use, must be 0!

    createInfo.queryType = VK_QUERY_TYPE_TIMESTAMP;
    createInfo.queryCount = mCommandBuffers.size() * 2; // REVIEW

    VkResult result = vkCreateQueryPool(mDevice, &createInfo, nullptr, &mTimeQueryPool);
    if (result != VK_SUCCESS)
    {
        throw std::runtime_error("Failed to create time query pool!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的想法是queryCount = mCommandBuffers.size() * 2在渲染之前和之后为单独的查询时间戳留出空间,但我不知道这个假设是否正确。

2:记录命令缓冲区 …

time rendering vulkan

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

C++ 17 元编程递归结构:enum 或 constexpr

出于说明目的,我展示了两个小的、略有不同的模板化递归定义。一个使用 an enum,另一个使用static constexpr定义一个值。

我检查了两个程序的输出程序集,它们完全相同,并且在语义上它们看起来也相同。

我认为constexpr可能更现代一些,但是使用enum/之间有什么区别static constexpr,或者是否有任何特定用例的区别真的很重要?

// using enum
template<uint64_t N>
struct Sum {
    enum : uint64_t { value = N + Sum<N - 1>::value };
};

template<>
struct Sum<0> {
    enum : uint64_t { value = 1 };
};
Run Code Online (Sandbox Code Playgroud)
// using static constexpr
template<uint64_t N>
struct Sum {
    static constexpr uint64_t value = N + Sum<N - 1>::value;
};

template<>
struct Sum<0> {
    static constexpr uint64_t value = 1; …
Run Code Online (Sandbox Code Playgroud)

c++ enums templates constexpr c++17

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

参数不得初始化

是否可以向函数参数添加编译器级约束,它们必须尚未初始化,例如,以下情况可以正常:

void f(SomeClass& a) { /* ... */ }

int main() {
    f(new SomeClass());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然以下内容不合适:(因为a已初始化并存储在变量中)

int main() {
    SomeClass a;
    f(a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ compilation

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