这个问题特定于MSVC编译器(特别是2008),但我也对非编译器特定的答案感兴趣.
我试图弄清楚如何在堆栈上对齐char缓冲区,基于某些任意类型的对齐.理想情况下,代码将为:
__declspec( align( __alignof(MyType) ) ) char buffer[16*sizeof(MyType)];
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用
错误C2059:语法错误:'__ builtin_alignof'
编译器只是不喜欢嵌套语句.
我唯一的另一个想法是这样做:
char buffer[16*sizeof(MyType)+__alignof(MyType)-1];
char * alignedBuffer = (char*)((((unsigned long)buffer) + __alignof(MyType)-1)&~(__alignof(MyType)-1));
Run Code Online (Sandbox Code Playgroud)
有谁知道更好的方式?似乎declspec的东西应该工作,我只是语法错误或什么?
谢谢阅读 :)
更新 - 检查下面
将保持尽可能短.如果需要,很高兴添加更多细节.
我有一些用于规范化矢量的sse代码.我正在使用QueryPerformanceCounter()(包装在一个辅助结构中)来衡量性能.
如果我这样衡量
for( int j = 0; j < NUM_VECTORS; ++j )
{
Timer t(norm_sse);
NormaliseSSE( vectors_sse+j);
}
Run Code Online (Sandbox Code Playgroud)
我得到的结果通常比仅使用表示向量的4个双精度进行标准规范化更慢(在相同配置中进行测试).
for( int j = 0; j < NUM_VECTORS; ++j )
{
Timer t(norm_dbl);
NormaliseDBL( vectors_dbl+j);
}
Run Code Online (Sandbox Code Playgroud)
但是,像这样计时整个循环
{
Timer t(norm_sse);
for( int j = 0; j < NUM_VECTORS; ++j ){
NormaliseSSE( vectors_sse+j );
}
}
Run Code Online (Sandbox Code Playgroud)
显示SSE代码要快一个数量级,但不会真正影响双版本的测量.我做了一些实验和搜索,似乎无法找到合理的答案.
例如,我知道在将结果转换为浮动时可能存在惩罚,但这些都不会发生.
有人可以提供任何见解吗?在每个规范化之间调用QueryPerformanceCounter会如何减慢SIMD代码的速度呢?
谢谢阅读 :)
更多细节如下:
简单的矢量结构
_declspec(align(16)) struct FVECTOR{
typedef float REAL;
union{
struct { REAL x, y, …
Run Code Online (Sandbox Code Playgroud) 我有一个普遍的问题,可能是一个特定的编译器.我对调用构造函数的条件感兴趣.具体来说,在针对速度优化的发布模式/版本中,在实例化对象时是否始终会调用编译器生成的或空的构造函数?
class NoConstructor
{
int member;
};
class EmptyConstructor
{
int member;
};
class InitConstructor
{
InitConstructor()
: member(3)
{}
int member;
};
int main(int argc, _TCHAR* argv[])
{
NoConstructor* nc = new NoConstructor(); //will this call the generated constructor?
EmptyConstructor* ec = new EmptyConstructor(); //will this call the empty constructor?
InitConstructor* ic = new InitConstructor(); //this will call the defined constructor
EmptyConstructor* ecArray = new EmptyConstructor[100]; //is this any different?
}
Run Code Online (Sandbox Code Playgroud)
我已经做了很多搜索,并花了一些时间查看Visual Studio中生成的汇编代码.但是,在发布版本中可能很难遵循.
总结:构造函数总是被调用吗?如果是这样,为什么?
我知道这很大程度上取决于编译器,但肯定有一个共同的立场.您可以引用的任何示例/来源都将非常感激.
我一直在尝试使用microsoft的sse内在函数来优化我使用的代码.优化我的代码时最大的问题之一是每当我想使用常量时就会发生LHS.似乎有一些关于生成某些常量的信息(这里和这里 - 第13.4节),但它的所有汇编(我宁愿避免).
问题是当我尝试用内在函数实现相同的东西时,msvc抱怨不兼容的类型等.有没有人知道使用内在函数的任何等效技巧?
示例 - 生成{1.0,1.0,1.0,1.0}
//pcmpeqw xmm0,xmm0
__m128 t = _mm_cmpeq_epi16( t, t );
//pslld xmm0,25
_mm_slli_epi32(t, 25);
//psrld xmm0,2
return _mm_srli_epi32(t, 2);
Run Code Online (Sandbox Code Playgroud)
这会产生一堆关于不兼容类型的错误(__m128 vs _m128i).我对此很陌生,所以我很确定我错过了一些明显的东西.有人可以帮忙吗?
tldr - 如何使用ms intrinsics生成一个填充了单精度常量浮点数的__m128 vec?
谢谢阅读 :)
所以我是ac#noob.我有一个简单的问题,我找不到其他任何地方的答案.
[Serializable()]
public class Dictionary
{
private Random m_RandomGenerator = new Random();
public int GetNext()
{
return m_RandomGenerator.Next(100);
}
}
Run Code Online (Sandbox Code Playgroud)
在Dictionary
每个节目开始时间点被加载,而这个代码将返回完全相同的序列每次运行时数.我的意思是,每次运行可执行文件.当然它所播种的时间值应该是不同的(DateTime.Now.Ticks我假设?).
几点:
有谁知道为什么?我仔细检查过我每次都没有创建一个新的Dictionary实例,所以这不是问题.
好吧,让我感到尴尬.事实证明,罪魁祸首是[Serializable()]属性.我使用的字典类是从先前导出的文件加载的,显然是将种子加载回Random().将变量更改为静态意味着不再从先前序列化的实例加载种子值 - 隐藏问题.
感谢所有提供建设性意见的人!
更新:以下潜在解决方案
我有一大堆配置文件,包括我想要推送到数据库中的键/值对.在配置文件中重复了很多键和值,因此我使用3个表存储数据.一个用于所有唯一键值,一个用于所有唯一对值,另一个列出每个文件的所有键/值对.
问题: 我正在使用多个并发进程(以及连接)将原始数据添加到数据库中.不幸的是,在尝试向键和值表添加值时,我遇到了很多检测到的死锁.我尝试了几种不同的插入数据的方法(如下所示),但最终总是出现"检测到死锁"错误
TransactionRollbackError:检测到死锁
详细信息:进程26755在事务689456上等待ShareLock; 由进程26754阻止.进程26754在事务689467上等待ShareLock; 被进程26755阻止.
我想知道是否有人可以对可能导致这些死锁的确切原因有所了解,并可能指出我采取某种方法解决问题.看看我正在使用的SQL语句(下面列出),我真的不明白为什么会有任何共同依赖.
谢谢阅读!
示例配置文件:
example_key this_is_the_value
other_example other_value
third example yet_another_value
Run Code Online (Sandbox Code Playgroud)
表定义:
CREATE TABLE keys (
id SERIAL PRIMARY KEY,
hash UUID UNIQUE NOT NULL,
key TEXT);
CREATE TABLE values (
id SERIAL PRIMARY KEY,
hash UUID UNIQUE NOT NULL,
key TEXT);
CREATE TABLE keyvalue_pairs (
id SERIAL PRIMARY KEY,
file_id INTEGER REFERENCES filenames,
key_id INTEGER REFERENCES keys,
value_id INTEGER REFERENCES values);
Run Code Online (Sandbox Code Playgroud)
SQL语句:
最初我试图使用此语句来避免任何异常:
WITH s AS (
SELECT id, hash, key FROM …
Run Code Online (Sandbox Code Playgroud) 我对数据库很新,我正在寻找一些高级别的建议.
我正在使用Postgres 9.3构建数据库的情况在数据库中是一个表,我在其中存储日志文件.
CREATE TABLE errorlogs (
id SERIAL PRIMARY KEY,
archive_id INTEGER NOT NULL REFERENCES archives,
filename VARCHAR(256) NOT NULL,
content TEXT);
Run Code Online (Sandbox Code Playgroud)
内容中的文本长度可以在1k到50MB之间变化.
问题
我希望能够对"内容"列中的数据执行相当快速的文本搜索(例如,WHERE CONTENT LIKE'%some_error%').现在搜索速度非常慢(> 8分钟搜索8206行).
我知道索引是我的问题的解决方案,但我似乎无法创建索引 - 每当我尝试我得到索引太大的错误.
=#CREATE INDEX error_logs_content_idx ON错误日志(content text_pattern_ops);
错误:索引行需要1796232个字节,最大大小为8191
我希望就如何解决这个问题提出一些建议.我可以更改最大索引大小吗?或者,我是否应该尝试使用Postgres对文本字段进行全文搜索?
任何建议都非常感谢!
我最近正在审查同事的代码,并注意到他已将"inline"关键字放在一组在类声明中定义的Getter函数之前.
例如
class Foo
{
public:
inline bool GetBar() const { return m_Bar; }
private:
bool m_Bar;
};
Run Code Online (Sandbox Code Playgroud)
我在代码审查中建议他删除内联关键字,因为我在许多不同的地方读过,在类声明中定义函数是由编译器解释的(在这种情况下是MSVC,但显然是C++标准的一部分) )作为作者想要内联函数的指示.我的感觉是,如果额外的文本不起任何作用,那就是不必要的混乱,应该删除.
他的回应如下:
inline关键字使得与此代码交互的其他程序员清楚地知道这些函数是/应该内联的.
在这种情况下,许多编译器仍然会考虑内联关键字并使用它来影响(读取:增加)某种加权,用于确定所述函数是否实际上是内联的.
如果所述函数由于某种原因未被内联,则具有内联关键字意味着将"触发警告,如果未内联"警告将被触发(如果已启用).
就个人而言,我完全不同意第一个原因.对我来说,拥有类声明中定义的函数足以表明意图.
我对最后两个原因持怀疑态度.我找不到任何确认或否认有关影响某种加权的内联关键字的观点的信息.对于在类声明中定义的函数,我也无法触发"警告,如果没有内联"警告.
如果您已经阅读过这篇文章,我想知道您是否对上述任何一点有任何见解?另外,如果你能指出我的任何相关文章/文件,我真的很感激.
谢谢!
我有一个表(Postgres 9.3)定义如下:
CREATE TABLE tsrs (
id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers,
timestamp TIMESTAMP WITHOUT TIME ZONE,
licensekeys_checksum VARCHAR(32));
Run Code Online (Sandbox Code Playgroud)
这里的相关细节是 the customer_id
、 thetimestamp
和 the licensekeys_checksum
。可以有多个具有相同的条目customer_id
,其中一些可能具有匹配的licensekey_checksum
条目,有些可能不同。永远不会有具有相同校验和和相同时间戳的行。
我想返回一个表,其中包含具有匹配条目的每组行的 1 行licensekeys_checksum
。为每个组返回的行应该是具有最新/最近时间戳的行。
输入示例:
CREATE TABLE tsrs (
id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers,
timestamp TIMESTAMP WITHOUT TIME ZONE,
licensekeys_checksum VARCHAR(32));
Run Code Online (Sandbox Code Playgroud)
期望的输出:
1, 2, 2014-08-21 16:03:35, 3FF2561A
2, 2, 2014-08-22 10:00:41, 3FF2561A
2, 2, 2014-06-10 10:00:41, 081AB3CA …
Run Code Online (Sandbox Code Playgroud) 在堆栈溢出上已经有一些类似于此的问题,但似乎没有什么能直接回答我的问题.如果我重新发布,我会道歉.
我想重载一些模板化类的方法(带有2个模板参数),并对这些方法进行部分模板特化.我无法弄清楚正确的语法,并开始认为这是不可能的.我以为我会在这里发帖,看看能不能得到确认.
要遵循的示例代码:
template <typename T, typename U>
class Test
{
public:
void Set( T t, U u );
T m_T;
U m_U;
};
// Fully templated method that should be used most of the time
template <typename T, typename U>
inline void Test<T,U>::Set( T t, U u )
{
m_T=t;
m_U=u;
}
// Partial specialisation that should only be used when U is a float.
// This generates compile errors
template <typename T>
inline void Test<T,float>::Set( T t, float …
Run Code Online (Sandbox Code Playgroud) c++ ×6
postgresql ×3
simd ×2
sse ×2
alignment ×1
c ×1
c# ×1
constructor ×1
inline ×1
optimization ×1
overloading ×1
random ×1
sql ×1
templates ×1