if-constexpr 相关问题


Cuda Tensor Core:矩阵大小仅为 16x16

我有这个非常简单的代码来将两个矩阵与 Cuda Tensor Core 相乘 constexpr int M = 16; constexpr int N = 16; constexpr int K = 16; /* * 矩阵 A = M x N,B = N x K,C = M x K => ...


constexpr int* ptr =&i 在 msvc 中编译,但不能在 clang 和 gcc 中编译

我正在使用此处列出的书籍学习 constexpr 变量。特别是我在 C++ Primer 中读到: 声明为 constexpr 的变量是隐式 const,并且必须使用常量初始化


“const int*”类型的值不能用于初始化“int* const”类型的实体

我在 vs 2022 社区版本上有 c++ 代码。 导入标准; int main() { constexpr int x = 10; constexpr int* p = &x; } 我不允许将 x 的地址分配给 p


模板 lambda 中的数组引用推导

我编写了一个简单的 lambda 函数,将一个静态大小数组复制到另一个数组中 #包括 #包括 int main() { constexpr auto copyArray = [](auto& out, const aut...


为什么将operator()作为std::function调用不起作用

考虑这个旨在收集字符串序列的小类: 班级问题_t期末 { 私人的: std::vector m_issues; 民众: constexpr void 运算符()(std::string&a...


如何检查类型是否源自向量/列表/双端队列?

我正在使用C++20。 我能够检查类型是否是某种向量/双端队列/列表,如下所示: 模板 结构 is_listish_trait { 静态 constexpr 布尔值 = 0; }; /* 这些是 li...


编译时检查,检查类型是否“是”向量/列表/双端队列

我正在使用C++20。 我能够检查类型是否是某种向量/双端队列/列表,如下所示: 模板 结构 is_listish_trait { 静态 constexpr 布尔值 = 0; }; /* 这些是 li...


汇编和模板类

我正在开发一个小项目,并尝试将一些硬编码值用于内联汇编。为此,我使用模板。我创建了一个代码片段来显示我所看到的 #包括 我正在开发一个小项目,并尝试将一些硬编码值用于内联汇编。为此,我使用模板。我创建了一个代码片段来显示我所看到的 #include <iostream> template <size_t T> struct MyClass { size_t myValue = T; void doSomething() { size_t value = T; __asm { mov eax, [T] mov [value], eax } std::cout << value << std::endl; } }; int main() { auto o = new MyClass<999>(); o->doSomething(); return 0; } 事实证明,对于汇编代码,它试图使用数据段而不是“直接将数字粘贴到那里” ; 25 : { push ebp mov ebp, esp push ecx ; 26 : auto o = new MyClass<999>(); push 4 call ??2@YAPAXI@Z ; operator new add esp, 4 ; 14 : size_t value = T; mov DWORD PTR _value$2[ebp], 999 ; 000003e7H ; 26 : auto o = new MyClass<999>(); mov DWORD PTR [eax], 0 mov DWORD PTR [eax], 999 ; 000003e7H ; 15 : __asm ; 16 : { ; 17 : mov eax, [T] mov eax, DWORD PTR ds:0 ; 18 : mov [value], eax mov DWORD PTR _value$2[ebp], eax ; 19 : } ; 20 : std::cout << value << std::endl; 我正在使用 Visual Studio 2015。还有其他方法可以实现此目的吗? 啊,多么可爱又扭曲的问题啊! 我尝试使用 T 初始化 constexpr 变量。结果是相同的 - 从内存加载值。宏可用于将文字传递给内联汇编,但它们与模板不能很好地混合。 使用 T 在类中初始化枚举在理论上应该可行(https://msdn.microsoft.com/en-us/library/ydwz5zc6.aspx提到枚举可以在内联汇编中使用),但是在内联汇编使 Visual Studio 2015 编译器崩溃:-)。 似乎有效的是一个函数模板,它使用模板参数声明一个枚举,然后在内联程序集中使用该枚举。如果必须将其放在模板类中,则可以在类中实例化模板函数,如下所示: #include <iostream> template <size_t T> void dosomething() { enum { LOCALENUM = T }; size_t value = 0; __asm { mov eax, LOCALENUM mov[value], eax } std::cout << value << std::endl; } template <size_t T> struct MyClass { size_t myValue = T; void doSomething() { ::dosomething<T>(); } }; int main() { //dosomething<999>(); auto o = new MyClass<999>(); o->doSomething(); return 0; } 这会产生以下汇编代码: auto o = new MyClass<999>(); 001B1015 mov dword ptr [eax],0 001B101B mov dword ptr [eax],3E7h o->doSomething(); 001B1021 mov eax,3E7h <--- Victory! 001B1026 mov dword ptr [ebp-4],eax 001B1029 mov ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (01B2048h)] 001B102F push offset std::endl<char,std::char_traits<char> > (01B1050h) 001B1034 push dword ptr [ebp-4] 001B1037 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (01B2044h)]


© www.soinside.com 2019 - 2024. All rights reserved.