系统要求某些基元与存储器内的某些点对齐(对于4的倍数的字节,对于2的倍数的字节的短路,等等).当然,这些可以被优化以浪费填充中的最小空间.
我的问题是GCC为什么不自动执行此操作?更明显的启发式(从最大尺寸要求到最小尺寸的订单变量)是否缺乏某种方式?一些代码是否依赖于其结构的物理排序(这是一个好主意)?
我只是问,因为GCC在很多方面都是超级优化的,但不是在这个方面,我认为必须有一些相对很酷的解释(我不知道).
在Linux上使用相当大的C++代码库和GCC工具链时,我遇到了执行布尔检查的代码,如下所示:
#include <stdio.h>
int main() {
bool foo = true;
if (~foo) {
// do some expensive operation
printf("This can be bad...\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这看起来像一个明显的错误,因为~运算符在C++中表示逐位NOT,而不是逻辑NOT,就像在MATLAB中那样.上面的代码总是评估为true
幸运的是,这个错误造成的问题不是很重要(这只是一个小小的性能损失),但它让我想到如何在这么多时间内找不到这个错误.
由于逐位运算符触发从布尔值到整数的隐式转换(这是一个促销),因此它本身没有任何问题.然而,对我而言,似乎至少clang-tidy应该能够将其视为逻辑错误,因为很明显,在大多数情况下,意图不是对bool应用逐位操作,而是而是一个逻辑的.
g++即使-Wall -Wextra -Wconversion启用也似乎并不关心这个问题,这是明智的,因为正如我之前提到的,这不符合标准.(我甚至试过g++6.3,它应该有很多新的检查,但仍然没有任何结果
使用clang-tidy所有启用的检查(真的很快就会变得嘈杂)会警告隐式转换本身("隐式转换bool - >'int'"),但似乎没有与应用bit-相关的特定警告聪明的操作员到布尔.
以不同的方式编写if语句if(~foo == true),虽然详细并导致始终为false的情况,但确实会导致更有意义的错误,从而引起注意,但是在使用terser if(~foo)表单时不会发生这种情况.
是否有任何方法/工具来检查这些问题,这些问题是100%正确的C++,但很可能是错误?
在研究我的Python Web应用程序的一些奇怪问题时(特别是有关MongoDB连接的问题),我在官方PyMongo文档页面上注意到了一些问题.我的Web应用程序使用Flask,但这不应该影响我面临的问题.
PyMongo驱动程序执行连接池,但是AutoReconnect当连接失效并且重新连接到期时,它也会抛出异常().
它声明(关于AutoReconnect异常):
为了自动重新连接,您必须处理此异常,并认识到导致它的操作未必成功.将来的操作将尝试打开与数据库的新连接(并将继续引发此异常,直到第一次成功建立连接).
我注意到这实际上经常发生(并且它似乎不是一个错误).MongoDB服务器在几分钟不活动之后关闭连接,并且需要由Web应用程序重新创建.
我不明白为什么PyMongo驱动程序重新连接时会抛出错误(驱动程序的用户需要自己处理),而不是透明地执行.(甚至有可能是一个选项,用户可以设置使AutoReconnect异常不抛出,但将不是一个合理的默认是这些异常没有得到根本抛出,以及连接无缝重现?)
我从来没有遇到过使用其他数据库系统的这种行为,这就是为什么我有点困惑.
还值得一提的是,当连接到我的本地开发MongoDB服务器时,我的Web应用程序的MongoDB连接永远不会失败(我假设它与本地连接的事实有关,并且连接是通过UNIX套接字而不是通过UNIX套接字完成的一个网络套接字,但我可能是错的).
在关于JVM基于char []实现字符串创建的方式的问题之后,我已经提到当char []被复制到新字符串的内部时不会发生迭代,因为最终会调用System.arraycopy,它使用诸如memcpy之类的函数在原生的,依赖于实现的级别(原始问题)复制所需的存储器.
我想亲自检查一下,所以我下载了Openjdk 7源代码并开始浏览它.我在OpenJDK C++源代码中找到了System.arraycopy的实现,在openjdx/hotspot/src/share/vm/oops/objArrayKlass.cpp:
if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
// elements are guaranteed to be subtypes, so no check necessary
bs->write_ref_array_pre(dst, length);
Copy::conjoint_oops_atomic(src, dst, length);
} else {
// slow case: need individual subtype checks
Run Code Online (Sandbox Code Playgroud)
如果元素不需要类型检查(例如原始数据类型数组的情况),则调用Copy :: conjoin_oops_atomic.
该Copy::conjoint_oops_atomic函数位于'copy.hpp'中:
// overloaded for UseCompressedOops
static void conjoint_oops_atomic(narrowOop* from, narrowOop* to, size_t count) {
assert(sizeof(narrowOop) == sizeof(jint), "this cast is wrong");
assert_params_ok(from, to, LogBytesPerInt);
pd_conjoint_jints_atomic((jint*)from, (jint*)to, count);
}
Run Code Online (Sandbox Code Playgroud)
现在我们依赖于平台,因为复制操作具有基于OS /体系结构的不同实现.我将以Windows为例.openjdk\hotspot\src\os_cpu\windows_x86\vm\copy_windows_x86.inline.hpp: …
我最近开始使用Gulp.js将我的所有CSS和JavaScript打包成单个文件,然后将其包含在我的Web应用程序中.我的网络应用程序是用Python编写的(使用Flask).
我显然不想使用git跟踪Gulp输出CSS和JS文件(因为它们是构建输出文件).
我使用push to deploy将我的网站部署到Azure网站.也就是说,我只是运行git push azure master,Azure自动确定我正在使用Python,设置virtualenv,安装pip依赖项等等.本文介绍如何进行此设置.
这个过程很有效,但是现在我已经开始使用Gulp,我想确保每当我部署网站时,也会在服务器端生成连接的JavaScript和CSS文件.
此外,在将来,我希望Azure在部署时运行所有测试,并且只有在它们全部通过时才能成功部署.
遗憾的是,我还没有为此工作流找到令人满意的解决方案,因为我无法为Azure的自动部署过程添加自定义步骤.
我曾尝试使用Kudu编写自定义部署脚本(正如此博客文章所建议的那样),但这样做会禁用Azure通常执行的所有自动步骤; 运行azure site deploymentscript --python只生成一个非常基本的Kudu部署文件,该web.config文件不处理文件中的读取,设置virtualenv或安装依赖项.我自己没有找到关于如何做到这一点的文件; 我使用默认的自动Azure部署脚本(当我推送代码时会生成服务器端,所以我自己无法访问它),因为不会处理像virtualenv和pip依赖项这样的东西.
有没有可用的解决方法,以便我可以自定义我的部署脚本(例如运行Gulp),同时仍然正确部署Flask?
我正在用 Python 实现一些基本的线性方程求解器。
我目前已经实现了三角方程组的前向和后向替代(因此求解起来非常简单!),但即使对于大约 50 个方程组(50x50 系数矩阵),解的精度也会变得非常差。
以下代码执行前向/后向替换:
FORWARD_SUBSTITUTION = 1
BACKWARD_SUBSTITUTION = 2
def solve_triang_subst(A: np.ndarray, b: np.ndarray,
substitution=FORWARD_SUBSTITUTION) -> np.ndarray:
"""Solves a triangular system via
forward or backward substitution.
A must be triangular. FORWARD_SUBSTITUTION means A should be
lower-triangular, BACKWARD_SUBSTITUTION means A should be upper-triangular.
"""
rows = len(A)
x = np.zeros(rows, dtype=A.dtype)
row_sequence = reversed(range(rows)) if substitution == BACKWARD_SUBSTITUTION else range(rows)
for row in row_sequence:
delta = b[row] - np.dot(A[row], x)
cur_x = delta / A[row][row]
x[row] …Run Code Online (Sandbox Code Playgroud) 我在MacVim上使用YouCompleteMe(OSX 10.9.4上的vim 7.4)用于Python代码自动完成.
YCM在引用Python内置功能(如os.*东西)时工作得很好,但它似乎无法自动完成由我或使用pip安装的各种软件包编写的标识符.
根据其文档,YouCompleteMe使用Jedi完成Python代码,Jedi GitHub页面明确指出Jedi可以自动完成任何代码,而不仅仅是标准库标识符.
有没有人知道为什么绝地没有拿起任何包或自定义代码?
我看到一个 Java 示例,其中有一个 main 方法标记为 synchronized,调用另一个静态同步方法。结果是,基本上,其他方法仅在主方法返回后才在单独的线程上运行。
这样的构造有什么实际功能?
public class SynchronisedMain {
public static synchronized void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
thingy();
}
}).start();
System.out.println("Kickstarted thingy thread.");
TimeUnit.MILLISECONDS.sleep(1000);
}
public static synchronized void thingy() {
System.out.println("Thingy!");
}
}
Run Code Online (Sandbox Code Playgroud) 我希望有一个std::hash_map映射(例如)常规std:strings到另一个模板类的多个不同的特化.
这个例子就是我想要实现的(虽然它是错误的但不编译):
template<typename T>
class Foo {
public:
Foo(T _value)
{
this-> value = _value;
}
private:
T value;
};
int main()
{
hash_map<string, Foo> various_foos;
various_foos["foo"] = Foo<int>(17);
various_foos["bar"] = Foo<double>(17.4);
}
Run Code Online (Sandbox Code Playgroud) 我正在用C++编写一个小游戏作为练习,我遇到了一个难题.其基本思路是,Level有一个vector的Entity,每个Entity实例都知道它属于哪个级别.到目前为止非常简单.
我在我的Entity类中得到了一些讨厌的编译错误,因为它无法弄清楚是什么Level.一个简单的前向类声明就在声明之前Entity轻松修复了.但是,我已经"Level.h"加入了"Entity.h".和Level和Entity均声明并在相同的命名空间中定义.
注意:Entity.h还包括Level.h.
#include "Level.h"
namespace GameNS {
// Required, otherwise the compiler complains
class Level;
class Entity
{
public:
...
Run Code Online (Sandbox Code Playgroud)
当编译器Level到达时,编译器是否应该知道它是Entity什么?
触发错误:= ORA-04079:触发器规范无效
导致该错误的代码如下:
CREATE OR REPLACE TRIGGER TRGBILLINGADDRESS
AFTER INSERT OR DELETE OR UPDATE ON TBLMACCOUNTADDRESS
add1 wom.tbltaddress.address1%TYPE;
add2 wom.tbltaddress.address2%TYPE;
cityid wom.tbltaddress.city_id%TYPE;
stateid wom.tbltaddress.state_id%TYPE;
pincd wom.tbltaddress.pincode%TYPE;
BEGIN
SELECT address1,address2,city_id,state_id,pincode
INTO add1,add2,cityid,stateid,pincd FROM wom.tbltaddress ta WHERE ta.ID IN (
SELECT vbac.billing_address_id
FROM wom.vw_billaddresschange vbac, wom.tbltaddress ita
WHERE vbac.billing_address_id = ita.ID
AND vbac.lcid = parlcid);
IF add1 = :NEW.address1 AND add2 = :NEW.address2 AND cityid = :NEW.cityid AND stateid = :NEW.stateid AND pincode = :NEW.zip THEN
dbms_output.put_line('Address Already Exist in tbltaddress table'); …Run Code Online (Sandbox Code Playgroud) 大家好.我试图渲染下面显示的两种方法.RenderA()使用VBO而RenderB()不是.我在RenderB()中到达glDrawArrays()时得到一个EXC_BAD_ACCESS错误.
如果我不创建和使用任何VBO,即当我注释掉CreateVBOs()和RenderA()时,RenderB()工作正常.
Render() {
CreateVBOs(); //glGenBuffers,glBindBuffer,glBufferData etc
RenderA();
RenderB();
}
RenderA(){
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo->indexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vbo->vertexBuffer);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), 0);
glColorPointer(4, GL_FLOAT, sizeof(Vertex), colorOffset);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawElements(GL_TRIANGLES,vbo->indexCount, GL_UNSIGNED_SHORT, bodyOffset);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}
RenderB(){
static GLfloat vertices[] = {1.0,1.0,1.0,2.0,1.0,1.0};
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_POINTS, 0, 2);
glDisableClientState(GL_VERTEX_ARRAY);
}
弄清楚了.显然你必须确保解除缓冲区的绑定,如果它之前是绑定的,以便在没有vbo的情况下进行渲染.
我的CreateVBOs()函数绑定但没有取消绑定缓冲区,以便在RenderB()尝试使用glDrawArrays时创建错误访问.取消绑定缓冲区只是将它绑定到0,如下所示:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud) 我需要从我从另一个函数获得的char**变量填充一个vector变量.
我自己尝试了以下程序:
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
char** getS();
int main()
{
int i;
vector<string> a;
cout << "Hello World" << endl;
char** b=getS();
char c[][5] = {"one","two","thr"};
//a.insert(a.begin(), b, b+3);
for(i=0;i<3; i++)
{
a.push_back(b[i]);
}
for(i=0;i<3; i++)
free(b[i] );
free(b);
for(i=0;i<3; i++)
{
cout <<a[i].c_str() << endl;
}
return 0;
}
char** getS()
{
char** list;
int number_of_row=3,number_of_col =5,i;
list = (char**)malloc(sizeof(char*)*number_of_row);
for(i=0;i<number_of_row; i++)
{
list[i] =(char*) malloc(sizeof(char)*number_of_col);
list[i] ="Hello";
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
我尝试在 …
c++ ×6
python ×4
java ×2
automation ×1
azure ×1
c ×1
concurrency ×1
deployment ×1
gcc ×1
gulp ×1
hashmap ×1
jvm ×1
macvim ×1
mongodb ×1
numpy ×1
opengl ×1
openjdk ×1
optimization ×1
oracle ×1
plsql ×1
pointers ×1
pymongo ×1
rendering ×1
sql ×1
struct ×1
templates ×1
vbo ×1
vector ×1
vim ×1
vim-plugin ×1
visual-c++ ×1